
현재 VPN 연결 등의 2FA를 위해 Google Authenticator를 사용하고 있습니다. OSX 상자에서 6자리 코드를 얻을 수 있는지 확인하고 싶었지만 어떤 이유로 oathtool
Authenticator와 동일한 값을 반환하지 않습니다. 그리고 인증기 코드는 작동하지만 oathtool
하나는 작동하지 않습니다.
흥미롭게도 저는 iOS 시뮬레이터에서도 시도해 보았습니다.https://github.com/mattrubin/Authenticator동일한 시스템에서 생성되는 코드는 oathtool
인증자가 아니라 동의합니다.
시간 동기화 문제일지도 모르지만 OSX 시간을 수동으로 동기화한 후에도 코드는 동일합니다. TOTP 알고리즘에 일치하지 않는 기본 매개변수가 있는지 궁금합니다. 하지만 그것이 무엇일지는 모르겠습니다.
이 oathtool
명령은 다음과 같은 내용을 출력합니다.
% oathtool --verbose --base32 --totp "$SECRET"
Hex secret: ...
Base32 secret: ...
Digits: 6
Window size: 0
Step size (seconds): 30
Start time: 1970-01-01 00:00:00 UTC (0)
Current time: 2016-10-20 22:27:22 UTC (1477002442)
Counter: 0x2EF3E06 (49233414)
(참고로 $SECRET
위의 값은 인증자가 사용한 QR 코드를 생성하는 데 사용된 값과 동일합니다.)
이들이 동의하지 않는 이유가 있나요?
업데이트
나는 다음을 사용하여 내 시스템 시간의 양쪽에서 30초의 시간을 조정하려고 했습니다.
oathtool --now "$(perl -e'use DateTime; print DateTime->now()->subtract(seconds=>30)->strftime( "%Y-%m-%d %H:%M:%S %Z" )')" -b --totp $SECRET -w 20|sort
위의 Perl은 다음 형식으로 시간을 생성합니다.
2016-10-20 23:36:15 UTC
또한 매번 20개의 숫자를 출력했지만 그 중 어느 것도 내가 Authenticator에 있는 것과 일치하지 않는 것 같았습니다.
답변1
편의와 완전성을 위해 "Google Authenticator oathtool"을 검색하면 여기로 이동하고 답변이 부분적으로 댓글에 나와 있으므로...
oathtool
및 Google OTP는 다음을 구현합니다.RFC 6238 TOTP. TOTP는 HMAC를 사용하여 6자리 출력을 생성합니다. 공식 Android 클라이언트는 더 이상 오픈 소스가 아니지만 TOTP 구현이 변경되었거나 "비밀"이기 때문이 아닙니다.
HMAC에는 숫자와 비밀이라는 2개의 입력이 있습니다. TOTP에서 숫자는 한 시대의 시간 간격 수이며, 둘 다의 기본값은 oathtool
30초 간격("시간 단계" 크기)이고 1970-01-01 00:00:00 UTC입니다. 명확하게 말하면, oathtool
GA는 매개변수가 동의하는 한 동의할 것입니다. 에포크와 시간은 충분히 가까워야 하며 시간 단계와 비밀은 일치해야 합니다.
필요한 경우(예: 일부 하드웨어 TOTP 토큰은 60초 간격을 사용함) 간격 크기를 설정하는 데 사용할 수 있으며 -s
오프셋/드리프트를 수용하기 위해 oathtool이 "현재"라고 생각하는 것을 재정의할 수 있습니다(또는 시대를 퍼지).
문제를 해결하려면 다음이 유용합니다.
oathtool -v --now "now -30 minutes" -w 120 --totp $SECRET
30초 간격 크기의 경우 30분 전부터 향후 30분까지 전체 시간의 값이 생성됩니다. 이것으로부터 토큰 오프셋 또는 클럭 오프셋을 추론할 수 있습니다( diff -y
출력을 나란히 비교하는 것이 유용할 수 있음). TOTP는 "유닉스 시간"을 사용하므로 시간대가 잘못된 시계의 큰 오프셋을 "숨기고" 있지 않는 한 시간대는 문제가 되지 않습니다.
--now
강력한 GNU 날짜-시간 구문 분석기를 사용 하고 --epoch
상대 시간 사양과 절대 타임스탬프를 지원하는 --now "30 min ago"
것도 작동합니다.
OP가 결정한 대로 기본 에포크 및 시간 단계에 대해 시간이 정확하다면 그렇지 않은 비밀이어야 합니다.
답변2
Google Authenticator와 oathtool을 동기화했습니다.
secret=`echo 1234567812345678 | base32`
oathtool -v --totp -b $secret
qrencode -t ANSI "otpauth://totp/test?secret="${secret}""