Google2FA는 RFC 4226에 지정된 HMAC 기반 일회용 비밀번호(HOTP) 알고리즘과 RFC 6238에 지정된 시간 기반 일회용 비밀번호(TOTP) 알고리즘을 지원하는 Google 2단계 인증 모듈의 PHP 구현입니다.
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 브리지가 있습니다.
이 패키지는 2FA용 QRCode를 생성하지 않습니다.
Google 2단계 인증을 찾고 있지만 이에 대한 QRCode도 생성해야 하는 경우 이 패키지를 통합하고 BaconQRCode 라이브러리를 사용하여 QRCode를 생성하는 Google2FA QRCode 패키지를 사용하거나 직접 수행하는 방법에 대한 옵션을 확인할 수 있습니다. 여기 문서에 있습니다.
Google2FA 패키지 플레이그라운드를 확인해 보세요.
다음은 Google2FA 사용 방법을 보여주는 데모 앱입니다: google2fa-example.
Google Authenticator 앱을 사용하여 이 (이전) 데모 페이지의 QR 코드를 스캔하고 (거의) 실시간으로 변경되는 코드를 볼 수 있습니다.
Composer를 사용하여 설치합니다.
composer require pragmarx/google2fa
인라인 QRCode를 생성하려면 BaconQrCode와 같은 QR 코드 생성기를 설치해야 합니다.
composer require bacon/bacon-qr-code
use PragmaRX Google2FA Google2FA ;
$ google2fa = new Google2FA ();
return $ google2fa -> generateSecretKey ();
사용자의 비밀 키를 생성하고 저장합니다.
$ user -> google2fa_secret = $ google2fa -> generateSecretKey ();
QRCode를 생성하는 보다 안전한 방법은 직접 생성하거나 라이브러리를 사용하는 것입니다. 먼저 위에서 설명한 대로 BaconQrCode와 같은 QR 코드 생성기를 설치한 다음 다음을 사용하여 QR 코드 URL을 생성하면 됩니다.
$ qrCodeUrl = $ google2fa -> getQRCodeUrl (
$ companyName ,
$ companyEmail ,
$ secretKey
);
QR 코드 URL이 있으면 선호하는 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 );
이 패키지는 좋은 QR 코드 패키지로 알려져 있기 때문에 Bacon/QRCode 사용을 제안하지만 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초 간격의 키가 고려됩니다. 적절하게 동기화된 시계를 가진 사용자에게는 키가 30초가 아닌 60초 동안 유효한 것처럼 보일 것입니다. 왜냐하면 키가 이미 만료된 경우에도(예: 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
(키가 유효하지 않거나 이전에 사용된 경우)이거나 제공된 키의 unix 타임스탬프를 키 재생성 기간인 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와 호환되려면 (base 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 );
2단계 인증을 사용하려면 사용자는 Google Authenticator 호환 앱을 설치해야 하며, 현재 사용 가능한 앱 중 일부는 다음과 같습니다.
QR 생성기용 Google API가 꺼져 있습니다. 5.0.0 이전의 해당 패키지 버전은 모두 더 이상 사용되지 않습니다. QRCode 생성에 관한 문서를 업그레이드하고 확인하십시오.
패키지 테스트는 PHPUnit으로 작성되었습니다. 테스트 및 분석을 실행하는 데 도움이 되는 몇 가지 Composer 스크립트가 있습니다.
PHP단위:
composer test
PHPStan 분석:
composer analyse
Google2FA는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
끌어오기 요청과 문제는 환영할 만한 일입니다.
없음.