Google Authenticator는 2 단계 인증을위한 SMS의 대안으로, 코드가 전송 될 Android에 앱을 설치합니다.
작동합니다. 연결없이; 비행기 모드에서도 작동합니다. 이것이 내가 이해하지 못하는 것입니다. 연결없이 작동하는 것은 어떻게 가능합니까? 휴대 전화와 서버는 어떻게 그 순간에 유효한 코드를 알기 위해 동기화합니까?
댓글
- 코드는 " 전송 된 "가 아닙니다. 시드와 카운터를 통해 만들어집니다. .
Answer
Google Authenticator는 HOTP를 모두 지원합니다. 및 TOTP 알고리즘은 일회용 암호를 생성합니다.
HOTP를 사용하면 서버와 클라이언트가 비밀 값을 공유하고 카운터는 양쪽에서 독립적으로 일회용 암호를 계산하는 데 사용됩니다. 암호가 생성되고 사용될 때마다 카운터가 양쪽에서 증가하여 서버와 클라이언트가 동기화 상태를 유지할 수 있습니다.
TOTP 기본적으로 HOTP와 동일한 알고리즘을 사용하지만 한 가지 큰 차이점이 있습니다. TOTP에서 사용되는 카운터는 현재 시간으로 대체됩니다. erver는 시스템 시간이 동일하게 유지되는 한 동기화 상태를 유지합니다. 이는 네트워크 시간 프로토콜 을 사용하여 수행 할 수 있습니다.
비밀 키 (HOTP의 경우 카운터 포함)에는 특정 시점에 서버와 클라이언트 모두에게 전달됩니다. Google Authenticator의 경우 QRCode 인코딩 URI 형식으로 수행됩니다. 자세한 내용은 KeyUriFormat 을 참조하세요.
댓글
- HOTP, Google Authenticator는 서버와 동기화하지 않고 비밀번호를 " 사용한 " 어떻게 알 수 있나요? Google Authenticator가하는 일은 계속해서 다른 키를 깜박이고 모바일에 피드백을 제공하지 않고 아무 키나 사용할 수 있다는 것입니다.
- @MarioAwad 이에 대한 대답은 HOTP RFC 섹션 7.4에서 찾을 수 있습니다. . ietf.org/rfc/rfc4226.txt
- 잘 정의 된 답변과 후속 조치에 감사드립니다. 섹션 7.4에 대한 간략한 요약 : 때때로 카운터 재 동기화와 카운터에 대한 미리보기 창은 즉시 동기화를 요구하지 않고 일을 작동하게 만듭니다.
- @TerryChia가 지적했듯이 비밀 키 QR 코드에 있습니다. QRCode / 정보의 민감도에 유의하십시오. 얼마 전에 블로그 게시물을 썼습니다. netknights.it/en/the-problem-with-the-google-authenticator
답변
작업 :
Authenticator는 TOTP (Time-Based One-Time Password) 알고리즘을 구현합니다. 다음과 같은 요소가 있습니다.
• 공유 비밀 (바이트 시퀀스)
• 현재 시간에서 파생 된 입력
• 서명 함수
공유 비밀 : 공유 비밀은 휴대 전화에서 계정을 설정하는 데 필요한 것입니다. . 휴대 전화로 QR 코드 사진을 찍거나 비밀번호를 수동으로 입력 할 수 있습니다.
입력 (현재 시간) : 휴대 전화에서 간단히 얻을 수있는 입력 시간 값입니다. 비밀번호를 얻은 후에는 서버와 더 이상 상호 작용할 필요가 없습니다. 그러나 휴대 전화의 시간이 서버로서 정확해야합니다. 기본적으로 서버에 알려진 현재 시간을 사용하여 전화기에서 일어나는 일을 반복합니다.
서명 기능 : 사용 된 서명 기능은 HMAC-SHA1입니다. HMAC는 Hash 기반 메시지 인증 코드를 의미하며 보안 단방향 해시 함수 (이 경우 SHA1)를 사용하여 값을 서명하는 알고리즘입니다. HMAC를 사용하면 진위 여부를 확인할 수 있습니다. 비밀을 아는 사람 만 동일한 입력 (현재 시간)에 대해 동일한 출력을 생성 할 수 있습니다.
OTP 알고리즘 :
의사 코드 :
original_secret = xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx secret = BASE32_DECODE(TO_UPPERCASE(REMOVE_SPACES(original_secret))) input = CURRENT_UNIX_TIME() / 30 // sets a constant value for 30 seconds hmac = SHA1(secret + SHA1(secret + input)) //apply hashing offset = hmac[len(hmac)-1] & 0x0F //Last nibble four_bytes = hmac[offset : offset+4] //takes a subset of 4 bytes from 20 bytes large_integer = INT(four_bytes) //Covert four bytes to integer small_integer = large_integer % 1,000,00 //gives 6 digit code
참조 : https://garbagecollected.org/2014/09/14/how-google-authenticator-works/
GO 구현을위한 github 프로젝트도 확인하세요. https://github.com/robbiev/two-factor-auth/blob/master/main.go
댓글
- Google 인증 기가 HOTP도 지원합니까 '?
답변
“시간을 기준으로 시드에서 작동하므로” RSA 열쇠 고리가 작동합니다. 즉, 연결이 필요하지 않습니다.
방금 둘러 보았는데 여기에 답변이 있습니다. https://stackoverflow.com/questions/8340495/how-rsa-tokens-works
답변
strace
가 sshd
데몬, 사용자 구성 파일을 읽을 때 서버가 비밀 키에 대해 “인식”하는 방법을 볼 수 있습니다.
#strace -f -v -e open /usr/sbin/sshd -p 2222 -dddd -f /etc/ssh/sshd_config 2>&1 | grep -i goog > > [pid 2105] open("/home/myuser/.google_authenticator", O_RDONLY) = 4 > > [pid 2105] open("/home/myuser/.google_authenticator~", > > O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_NOFOLLOW, 0400debug3: > > mm_sshpam_respond: pam_respond returned 1 [preauth]
휴대폰 이미 알고 있습니다. QR을 통해 스캔하거나 입력했습니다.
댓글
- 이는 토큰이 서버로 전송되지 않지만 ' 작동 방식을 실제로 설명하지 않습니다 (OP가 요청한 내용 임)
- ' 그 자체로는 아니지만 연결 부족 문제를 해결합니다.