Google2FA คือการใช้งาน PHP ของโมดูลการตรวจสอบสิทธิ์แบบสองปัจจัยของ Google ซึ่งสนับสนุนอัลกอริทึมรหัสผ่านครั้งเดียวที่ใช้ HMAC (HOTP) ที่ระบุใน RFC 4226 และอัลกอริทึมรหัสผ่านครั้งเดียวตามเวลา (TOTP) ที่ระบุใน 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 |
แพ็คเกจนี้ไม่เชื่อเรื่องพระเจ้า แต่มีสะพาน Laravel
แพ็คเกจนี้ไม่สร้าง QRCodes สำหรับ 2FA
หากคุณกำลังมองหาการตรวจสอบสิทธิ์แบบสองปัจจัยของ Google แต่จำเป็นต้องสร้าง QRCode ด้วย คุณสามารถใช้แพ็คเกจ Google2FA QRCode ซึ่งรวมแพ็คเกจนี้และสร้าง QRCodes โดยใช้ไลบรารี BaconQRCode หรือตรวจสอบตัวเลือกเกี่ยวกับวิธีการดำเนินการด้วยตัวเอง ที่นี่ในเอกสาร
โปรดตรวจสอบสนามเด็กเล่นแพ็คเกจ Google2FA
นี่คือแอปสาธิตที่แสดงวิธีใช้ Google2FA: google2fa-example
คุณสามารถสแกนโค้ด QR บนหน้าสาธิต (เก่า) นี้ด้วยแอป Google Authenticator และดูโค้ดที่เปลี่ยนแปลง (เกือบ) แบบเรียลไทม์
ใช้ Composer เพื่อติดตั้ง:
composer require pragmarx/google2fa
หากต้องการสร้าง QRCodes แบบอินไลน์ คุณจะต้องติดตั้งเครื่องสร้างโค้ด QR เช่น BaconQrCode:
composer require bacon/bacon-qr-code
use PragmaRX Google2FA Google2FA ;
$ google2fa = new Google2FA ();
return $ google2fa -> generateSecretKey ();
สร้างรหัสลับสำหรับผู้ใช้ของคุณและบันทึก:
$ user -> google2fa_secret = $ google2fa -> generateSecretKey ();
วิธีสร้าง QRCode ที่ปลอดภัยกว่าคือทำเองหรือใช้ไลบรารี ขั้นแรก คุณต้องติดตั้งเครื่องสร้างโค้ด QR เช่น BaconQrCode ตามที่ระบุไว้ข้างต้น จากนั้นคุณเพียงแค่ต้องสร้าง URL โค้ด QR โดยใช้:
$ qrCodeUrl = $ google2fa -> getQRCodeUrl (
$ companyName ,
$ companyEmail ,
$ secretKey
);
เมื่อคุณมี URL โค้ด QR แล้ว คุณสามารถป้อนไปยังเครื่องสร้างโค้ด QR ที่คุณต้องการได้
// 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="">
และเพื่อยืนยัน คุณเพียงแค่ต้อง:
$ secret = $ request -> input ( ' secret ' );
$ valid = $ google2fa -> verifyKey ( $ user -> google2fa_secret , $ secret );
แพ็คเกจนี้แนะนำให้ใช้ Bacon/QRCode เพราะเป็นแพ็คเกจ QR Code ที่ดี แต่สามารถใช้ร่วมกับแพ็คเกจอื่นๆ ได้ เช่น Google2FA QRCode, Simple QrCode หรือ Endroid QR Code ทั้งหมดใช้ Bacon/QRCode เพื่อ ผลิตรหัส QR
โดยปกติคุณจะต้องมี 2FA URL ดังนั้นคุณเพียงแค่ต้องใช้ตัวสร้าง URL:
$ google2fa -> getQRCodeUrl ( $ companyName , $ companyEmail , $ secretKey )
รับ QRCode เพื่อนำไปใช้แบบอินไลน์:
$ google2fa = ( new PragmaRX Google2FAQRCode Google2FA ());
$ inlineUrl = $ google2fa -> getQRCodeInline (
' Company Name ' ,
' [email protected] ' ,
$ google2fa -> generateSecretKey ()
);
และใช้ในเทมเพลตของคุณ:
<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>
สร้าง URL ข้อมูล
$ qrCode = new Endroid QrCode QrCode ( $ value );
$ qrCode -> setSize ( 100 );
$ google2fa_url = $ qrCode -> writeDataUri ();
และในมุมมองของคุณ
<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 ));
และแสดงเป็นภาพ:
<img src="data:image/png;base64, <?php echo $ qrcode_image; ?> "/>
เพื่อให้สอดคล้องกับ RFC6238 แพ็คเกจนี้รองรับ SHA1, SHA256 และ SHA512 โดยค่าเริ่มต้นจะเป็น SHA1 ดังนั้นหากต้องการใช้อัลกอริทึมอื่น คุณเพียงแค่ต้องใช้เมธอด setAlgorithm()
:
use PragmaRX Google2FA Support Constants ;
$ google2fa -> setAlgorithm ( Constants :: SHA512 );
เป็นสิ่งสำคัญมากที่คุณจะต้องรักษาเวลาเซิร์ฟเวอร์ของคุณให้ตรงกันกับเซิร์ฟเวอร์ NTP บางตัว บน Ubuntu คุณสามารถเพิ่มสิ่งนี้ลงใน crontab:
sudo service ntp stop
sudo ntpd -gq
sudo service ntp start
เพื่อหลีกเลี่ยงปัญหาเกี่ยวกับนาฬิกาที่ไม่ซิงค์กันเล็กน้อย เราจะไม่ตรวจสอบกับคีย์ปัจจุบันเท่านั้น แต่ยังพิจารณาคีย์ $window
แต่ละรายการจากอดีตและอนาคตด้วย คุณสามารถส่ง $window
เป็นพารามิเตอร์ตัวที่สามทางเลือกเพื่อ verifyKey
โดยมีค่าเริ่มต้นเป็น 1
เมื่อมีการสร้างคีย์ใหม่ทุกๆ 30 วินาที จากนั้นด้วยการตั้งค่าเริ่มต้น คีย์จากช่วงก่อนหน้า ช่วงปัจจุบัน และช่วง 30 วินาทีถัดไปหนึ่งช่วงจะได้รับการพิจารณา สำหรับผู้ใช้ที่มีนาฬิกาซิงโครไนซ์อย่างเหมาะสม คีย์จะดูเหมือนว่าคีย์นั้นใช้งานได้ 60 วินาทีแทนที่จะเป็น 30 วินาที เนื่องจากระบบจะยอมรับแม้ว่าจะหมดอายุไปแล้วก็ตาม เช่น 29 วินาทีก็ตาม
$ secret = $ request -> input ( ' secret ' );
$ window = 8 ; // 8 keys (respectively 4 minutes) past and future
$ valid = $ google2fa -> verifyKey ( $ user -> google2fa_secret , $ secret , $ window );
การตั้งค่าพารามิเตอร์ $window
เป็น 0
อาจหมายความว่าระบบจะไม่ยอมรับคีย์ที่ถูกต้องเมื่อผู้ใช้เห็นคีย์นั้นในตัวสร้าง เนื่องจากโดยปกติแล้วผู้ใช้จะใช้เวลาระยะหนึ่งในการป้อนคีย์ลงในฟิลด์แบบฟอร์มเฉพาะ
ผู้โจมตีอาจสามารถดูผู้ใช้ที่ป้อนข้อมูลประจำตัวและคีย์ครั้งเดียวได้ หากไม่มีข้อควรระวังเพิ่มเติม คีย์จะยังคงใช้งานได้จนกว่าจะไม่อยู่ภายในกรอบเวลาของเซิร์ฟเวอร์อีกต่อไป เพื่อป้องกันการใช้คีย์ครั้งเดียวที่ใช้ไปแล้ว คุณสามารถใช้ฟังก์ชัน 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
}
โปรดทราบว่า $timestamp
เป็น false
(หากคีย์ไม่ถูกต้องหรือเคยถูกใช้มาก่อน) หรือการประทับเวลายูนิกซ์ของคีย์ที่ระบุหารด้วยระยะเวลาการสร้างคีย์ใหม่ 30 วินาที
แม้ว่าความน่าจะเป็นของการชนกันของสตริงสุ่มขนาด 16 ไบต์ (128 บิต) จะต่ำมาก แต่คุณสามารถทำให้แข็งขึ้นได้โดย:
$ secretKey = $ google2fa -> generateSecretKey ( 32 ); // defaults to 16 bytes
คุณอาจนำหน้าคีย์ลับของคุณ แต่คุณต้องเข้าใจว่า เนื่องจากคีย์ลับของคุณต้องมีความยาวยกกำลัง 2 คำนำหน้าของคุณจึงต้องมีขนาดที่สมส่วนกัน ดังนั้นหากคีย์ของคุณมีความยาว 16 ไบต์ หากคุณเพิ่มคำนำหน้า คีย์นั้นจะต้องมีความยาว 16 ไบต์ด้วย แต่เนื่องจากคำนำหน้าของคุณจะถูกแปลงเป็นฐาน 32 ความยาวสูงสุดของคำนำหน้าของคุณคือ 10 ไบต์ ดังนั้น นี่คือขนาดที่คุณใช้ในคำนำหน้าได้:
1, 2, 5, 10, 20, 40, 80...
และสามารถใช้งานได้ดังนี้:
$ prefix = strpad ( $ userId , 10 , ' X ' );
$ secretKey = $ google2fa -> generateSecretKey ( 16 , $ prefix );
คุณสมบัติ Window กำหนดระยะเวลาที่ OTP จะทำงาน หรือจำนวนรอบที่จะใช้งานได้ คีย์มีรอบ 30 วินาที การตั้งค่าหน้าต่างเป็น 0 จะทำให้คีย์คงอยู่เป็นเวลา 30 วินาทีนั้น การตั้งค่าเป็น 2 จะทำให้คีย์คงอยู่เป็นเวลา 120 วินาที นี่คือวิธีที่คุณตั้งค่าหน้าต่าง:
$ secretKey = $ google2fa -> setWindow ( 4 );
แต่คุณยังสามารถตั้งค่าหน้าต่างในขณะที่ตรวจสอบกุญแจได้อีกด้วย หากคุณต้องการตั้งค่าหน้าต่างเป็น 4 ในระหว่างการตรวจสอบคีย์ ให้ทำดังนี้:
$ isValid = $ google2fa -> verifyKey ( $ seed , $ key , 4 );
คุณสามารถเปลี่ยนช่วงเวลาการสร้างคีย์ใหม่ได้ ซึ่งมีค่าเริ่มต้นอยู่ที่ 30 วินาที แต่โปรดจำไว้ว่านี่เป็นค่าเริ่มต้นสำหรับแอปตรวจสอบสิทธิ์ส่วนใหญ่ เช่น Google Authenticator ซึ่งโดยพื้นฐานแล้วจะทำให้แอปของคุณไม่ซิงค์กับแอปเหล่านั้น
$ google2fa -> setKeyRegeneration ( 40 );
เพื่อให้เข้ากันได้กับ Google Authenticator ความยาวคีย์ลับของคุณ (แปลงเป็นฐาน 32) ต้องมีอย่างน้อย 8 ตัวอักษรและต้องยกกำลัง 2: 8, 16, 32, 64...
ดังนั้น เพื่อป้องกันข้อผิดพลาด คุณสามารถทำสิ่งนี้ในขณะที่สร้างมันขึ้นมา:
$ secretKey = ' 123456789 ' ;
$ secretKey = str_pad ( $ secretKey , pow ( 2 , ceil ( log ( strlen ( $ secretKey ), 2 ))), ' X ' );
และก็จะทำให้เกิด
123456789XXXXXXX
ตามค่าเริ่มต้น แพ็คเกจนี้จะบังคับใช้ความเข้ากันได้ แต่หาก Google Authenticator ไม่ใช่เป้าหมาย คุณสามารถปิดการใช้งานได้โดยดำเนินการ
$ google2fa -> setEnforceGoogleAuthenticatorCompatibility ( false );
หากต้องการใช้การตรวจสอบสิทธิ์แบบสองปัจจัย ผู้ใช้ของคุณจะต้องติดตั้งแอปที่รองรับ Google Authenticator ซึ่งเป็นแอปบางส่วนที่ใช้งานได้ในปัจจุบัน:
Google API สำหรับโปรแกรมสร้าง QR ปิดอยู่ แพ็คเกจทุกเวอร์ชันก่อน 5.0.0 เลิกใช้แล้ว โปรดอัปเกรดและตรวจสอบเอกสารเกี่ยวกับการสร้าง QRCode
การทดสอบแพ็คเกจเขียนด้วย PHPUnit มีสคริปต์ Composer บางตัวที่จะช่วยคุณรันการทดสอบและการวิเคราะห์:
PHPหน่วย:
composer test
การวิเคราะห์ PHPStan:
composer analyse
Google2FA ได้รับอนุญาตภายใต้ใบอนุญาต MIT - ดูรายละเอียดในไฟล์ใบอนุญาต
คำขอดึงและปัญหาต่างๆ เป็นเรื่องที่น่ายินดีเป็นอย่างยิ่ง
ไม่มี.