Google2FA adalah implementasi PHP dari Modul Otentikasi Dua Faktor Google, mendukung algoritma Kata Sandi Satu Kali Berbasis HMAC (HOTP) yang ditentukan dalam RFC 4226 dan algoritma Kata Sandi Satu Kali Berbasis Waktu (TOTP) yang ditentukan dalam RFC 6238.
PHP | Google2FA |
---|---|
5.4 | 7.x LTS |
5.5 | 7.x LTS |
5.6 | 7.x LTS |
7.1 | 8.x |
7.2 | 8.x |
7.3 | 8.x |
7.4 | 8.x |
8.0 (β) | 8.x |
Paket ini agnostik, tapi ada jembatan Laravel.
Paket ini tidak menghasilkan QRCodes untuk 2FA.
Jika Anda mencari Otentikasi Dua Faktor Google, tetapi juga perlu membuat QRCode untuk itu, Anda dapat menggunakan paket Google2FA QRCode, yang mengintegrasikan paket ini dan juga menghasilkan QRCode menggunakan perpustakaan BaconQRCode, atau periksa opsi tentang cara melakukannya sendiri di sini, di dokumen.
Silakan periksa Playground Paket Google2FA.
Berikut adalah aplikasi demo yang menunjukkan cara menggunakan Google2FA: google2fa-example.
Anda dapat memindai kode QR di halaman demo (lama) ini dengan aplikasi Google Authenticator dan melihat perubahan kode (hampir) secara real-time.
Gunakan Komposer untuk menginstalnya:
composer require pragmarx/google2fa
Untuk menghasilkan QRCode inline, Anda perlu menginstal generator kode QR, misalnya BaconQrCode:
composer require bacon/bacon-qr-code
use PragmaRX Google2FA Google2FA ;
$ google2fa = new Google2FA ();
return $ google2fa -> generateSecretKey ();
Hasilkan kunci rahasia untuk pengguna Anda dan simpan:
$ user -> google2fa_secret = $ google2fa -> generateSecretKey ();
Cara yang lebih aman untuk membuat QRCode adalah dengan melakukannya sendiri atau menggunakan perpustakaan. Pertama anda harus install QR code generator misal BaconQrCode seperti yang sudah disebutkan di atas, selanjutnya anda tinggal generate url kode QRnya menggunakan:
$ qrCodeUrl = $ google2fa -> getQRCodeUrl (
$ companyName ,
$ companyEmail ,
$ secretKey
);
Setelah Anda memiliki url kode QR, Anda dapat memasukkannya ke pembuat kode QR pilihan Anda.
// Use your own QR Code generator to generate a data URL:
$ google2fa_url = custom_generate_qrcode_url ( $ qrCodeUrl );
/// and in your view:
<img src="{{ $ google2fa_url }}" alt="">
Dan untuk memverifikasi, Anda hanya perlu:
$ secret = $ request -> input ( ' secret ' );
$ valid = $ google2fa -> verifyKey ( $ user -> google2fa_secret , $ secret );
Paket ini menyarankan penggunaan Bacon/QRCode karena dikenal sebagai paket QR Code yang bagus, namun Anda dapat menggunakannya dengan paket lain, misalnya Google2FA QRCode, Simple QrCode atau Endroid QR Code, semuanya menggunakan Bacon/QRCode untuk menghasilkan Kode QR.
Biasanya Anda memerlukan URL 2FA, jadi Anda hanya perlu menggunakan pembuat URL:
$ google2fa -> getQRCodeUrl ( $ companyName , $ companyEmail , $ secretKey )
Dapatkan QRCode untuk digunakan sebaris:
$ google2fa = ( new PragmaRX Google2FAQRCode Google2FA ());
$ inlineUrl = $ google2fa -> getQRCodeInline (
' Company Name ' ,
' [email protected] ' ,
$ google2fa -> generateSecretKey ()
);
Dan gunakan di template Anda:
<img src="{{ $ inlineUrl }}">
<div class="visible-print text-center">
{!! QrCode :: size ( 100 )-> generate ( $ google2fa -> getQRCodeUrl ( $ companyName , $ companyEmail , $ secretKey )); !!}
<p> Scan me to return to the original page.</p>
</div>
Hasilkan URL data
$ qrCode = new Endroid QrCode QrCode ( $ value );
$ qrCode -> setSize ( 100 );
$ google2fa_url = $ qrCode -> writeDataUri ();
Dan menurut pandangan Anda
<div class="visible-print text-center">
{!! $ google2fa_url !!}
<p> Scan me to return to the original page.</p>
</div>
<?php
use PragmaRX Google2FA Google2FA ;
use BaconQrCode Renderer ImageRenderer ;
use BaconQrCode Renderer Image ImagickImageBackEnd ;
use BaconQrCode Renderer RendererStyle RendererStyle ;
use BaconQrCode Writer ;
$ google2fa = app ( Google2FA ::class);
$ g2faUrl = $ google2fa -> getQRCodeUrl (
' pragmarx ' ,
' [email protected] ' ,
$ google2fa -> generateSecretKey ()
);
$ writer = new Writer (
new ImageRenderer (
new RendererStyle ( 400 ),
new ImagickImageBackEnd ()
)
);
$ qrcode_image = base64_encode ( $ writer -> writeString ( $ g2faUrl ));
Dan tunjukkan sebagai gambar:
<img src="data:image/png;base64, <?php echo $ qrcode_image; ?> "/>
Untuk mematuhi RFC6238, paket ini mendukung SHA1, SHA256, dan SHA512. Defaultnya adalah SHA1, jadi untuk menggunakan algoritma yang berbeda Anda hanya perlu menggunakan metode setAlgorithm()
:
use PragmaRX Google2FA Support Constants ;
$ google2fa -> setAlgorithm ( Constants :: SHA512 );
Sangat penting bagi Anda untuk menjaga waktu server Anda tetap sinkron dengan beberapa server NTP, di Ubuntu Anda dapat menambahkan ini ke crontab:
sudo service ntp stop
sudo ntpd -gq
sudo service ntp start
Untuk menghindari masalah dengan jam yang sedikit tidak sinkron, kami tidak memeriksa kunci saat ini saja tetapi juga mempertimbangkan kunci $window
masing-masing dari masa lalu dan masa depan. Anda dapat meneruskan $window
sebagai parameter ketiga opsional ke verifyKey
, defaultnya adalah 1
. Jika kunci baru dibuat setiap 30 detik, maka dengan pengaturan default, kunci dari interval 30 detik sebelumnya, saat ini, dan berikutnya akan dipertimbangkan. Bagi pengguna dengan jam yang disinkronkan dengan benar, kunci tersebut akan terlihat valid selama 60 detik, bukan 30 detik, karena sistem akan menerimanya meskipun sudah kedaluwarsa, katakanlah 29 detik.
$ secret = $ request -> input ( ' secret ' );
$ window = 8 ; // 8 keys (respectively 4 minutes) past and future
$ valid = $ google2fa -> verifyKey ( $ user -> google2fa_secret , $ secret , $ window );
Menetapkan parameter $window
ke 0
juga dapat berarti bahwa sistem tidak akan menerima kunci yang valid ketika pengguna melihatnya di generator mereka karena biasanya memerlukan beberapa waktu bagi pengguna untuk memasukkan kunci ke kolom formulir tertentu.
Seorang penyerang mungkin dapat melihat pengguna memasukkan kredensial dan kunci satu waktunya. Tanpa tindakan pencegahan lebih lanjut, kunci tetap valid hingga tidak lagi berada dalam jangka waktu server. Untuk mencegah penggunaan kunci sekali pakai yang telah digunakan, Anda dapat memanfaatkan fungsi verifyKeyNewer
.
$ secret = $ request -> input ( ' secret ' );
$ timestamp = $ google2fa -> verifyKeyNewer ( $ user -> google2fa_secret , $ secret , $ user -> google2fa_ts );
if ( $ timestamp !== false ) {
$ user -> update ([ ' google2fa_ts ' => $ timestamp ]);
// successful
} else {
// failed
}
Perhatikan bahwa $timestamp
false
(jika kunci tidak valid atau telah digunakan sebelumnya) atau stempel waktu unix kunci yang diberikan dibagi dengan periode regenerasi kunci selama 30 detik.
Meskipun kemungkinan tabrakan string acak berukuran 16 byte (128 bit) sangat rendah, Anda dapat memperkuatnya dengan:
$ secretKey = $ google2fa -> generateSecretKey ( 32 ); // defaults to 16 bytes
Anda dapat memberi awalan pada kunci rahasia Anda, namun Anda harus memahami bahwa, karena kunci rahasia Anda harus memiliki panjang pangkat 2, awalan Anda harus memiliki ukuran yang saling melengkapi. Jadi jika kunci Anda panjangnya 16 byte, jika Anda menambahkan awalan, panjangnya juga harus 16 byte, tetapi karena awalan Anda akan dikonversi ke basis 32, panjang maksimal awalan Anda adalah 10 byte. Jadi, itulah ukuran yang dapat Anda gunakan di awalan Anda:
1, 2, 5, 10, 20, 40, 80...
Dan itu dapat digunakan seperti ini:
$ prefix = strpad ( $ userId , 10 , ' X ' );
$ secretKey = $ google2fa -> generateSecretKey ( 16 , $ prefix );
Properti Window menentukan berapa lama OTP akan bekerja, atau berapa banyak siklus yang akan bertahan. Sebuah kunci memiliki siklus 30 detik, menyetel jendela ke 0 akan membuat kunci bertahan selama 30 detik tersebut, menyetelnya ke 2 akan membuatnya bertahan selama 120 detik. Inilah cara Anda mengatur jendela:
$ secretKey = $ google2fa -> setWindow ( 4 );
Namun Anda juga dapat mengatur jendela sambil memeriksa kuncinya. Jika Anda perlu menyetel jendela 4 selama verifikasi kunci, berikut caranya:
$ isValid = $ google2fa -> verifyKey ( $ seed , $ key , 4 );
Anda dapat mengubah interval regenerasi kunci, yang defaultnya adalah 30 detik, namun ingat bahwa ini adalah nilai default pada sebagian besar aplikasi autentikasi, seperti Google Authenticator, yang pada dasarnya akan membuat aplikasi Anda tidak sinkron dengan aplikasi tersebut.
$ google2fa -> setKeyRegeneration ( 40 );
Agar kompatibel dengan Google Authenticator, panjang kunci rahasia Anda (dikonversi ke basis 32) harus minimal 8 karakter dan pangkat 2: 8, 16, 32, 64...
Jadi, untuk mencegah kesalahan, Anda dapat melakukan hal seperti ini saat membuatnya:
$ secretKey = ' 123456789 ' ;
$ secretKey = str_pad ( $ secretKey , pow ( 2 , ceil ( log ( strlen ( $ secretKey ), 2 ))), ' X ' );
Dan itu akan menghasilkan
123456789XXXXXXX
Secara default, paket ini akan menerapkan kompatibilitas, namun, jika Google Authenticator bukan target, Anda dapat menonaktifkannya dengan melakukan
$ google2fa -> setEnforceGoogleAuthenticatorCompatibility ( false );
Untuk menggunakan autentikasi dua faktor, pengguna Anda harus memasang aplikasi yang kompatibel dengan Google Authenticator, berikut beberapa aplikasi yang tersedia saat ini:
Google API untuk generator QR dinonaktifkan. Semua versi paket tersebut sebelum 5.0.0 tidak digunakan lagi. Harap tingkatkan dan periksa dokumentasi mengenai pembuatan QRCode.
Tes paket ditulis dengan PHPUnit. Ada beberapa skrip Komposer untuk membantu Anda menjalankan pengujian dan analisis:
Unit PHP:
composer test
Analisis PHPStan:
composer analyse
Google2FA dilisensikan di bawah Lisensi MIT - lihat file LISENSI untuk detailnya.
Permintaan tarik dan masalah sangat diterima.
Tidak ada.