구글OTP - 1 - 사용방법

2017. 11. 29. 16:15IT-분석/보안

반응형


구글 계정 로그인과 같은 과정은 생략.... 구글 OTP 사용 방법 설정에 대해서 설명합니다.


아래 그림 처럼, 2단계 인증을 활성화 시키시고, 앱비밀번호 라는 부분을 통해서


구글 OTP를 특정 Service의 인증용도로 사용할 수 있습니다.


물론, 스마트폰에서 구글OTP 앱도 설치하셔야 겠죠~






2 단계 인증의 기본 설정이 보통은 아래 그림의 구글 메세지로 되어 있습니다. 이걸 구글 OTP앱 으로 


변경해야 됩니다. 그러기 위해  Google 메세지 오른쪽에 있는 쓰레기통 아이콘으로 제거를 해주시면 아래로 내려가고


OTP앱이 (기본값) 으로 바뀌더군요~




2단계 인증이라는 것이 Google 계정에 로그인할 때, 보안성을 강화하기 위한 용도로 사용하는 것입니다만


Google 메시지가 훨씬 편리하고 쉬워보입니다. 로그인하려고 시도하면, 모바일로 뜨는 화면에서


본인이 맞다는 버튼만 눌러주면 되니까요~ ^^


그런데도 이 귀찮은 구글 OTP를 쓴다는 것은 그냥 자기 솔루션에 보안성 강화를 위해 구글이 만들어놓은 OTP 를


사용하고 싶다는 의미이겠죠~



말이 길었네요. 저도 아래글 보고 따라해보며 배운 겁니다. 참고하시길~


-------------------------------------------------------------------------------------------------------------------------------


(펌 : http://sojakzi.tistory.com/253 )



OTP(One Time Password)는 '일회용 패스워드'의 일종으로 은행 등에서 사용하는 강력한 인증 방식입니다.

인터넷뱅킹 등에서 보안카드와 OTP 중에서 선택해서 사용할 수 있는 건 이미 많은 사람이 알고 계실 겁니다. 그리고 피싱 사이트들이 보안카드 정보만 빼내가려고 하지 OTP 정보는 아직 건드리려고 시도하지 않기 때문에 수많은 피싱 공격으로부터 안전해진다는 사실도요. 아 이건 잘 모르시려나.


이 포스트는 안전한 은행거래를 위한 가이드가 아니고 OTP를 내 애플리케이션에 사용하는 방법을 설명하는 것이므로 보안카드 얘기는 그만하죠.


구글 OTP, GOTP는 안드로이드나 애플 앱스토어 등에서 다운로드받을 수 있습니다. 찾는 건 알아서 찾으시고, 설치해서 적절히 설정하고 실행하면 이런 화면을 보시게 됩니다.



이 GOTP는 오픈 소스라고 하는데 소스 분석은 나중에 하고요, 이 포스트에서는 이 GOTP를 내 애플리케이션에서 사용하는 방법을 설명드리겠습니다.

여기에는 세 개의 계정이 등록돼있습니다. 마지막 것이 내 애플리케이션에서 사용할 OTP코드인데요, 이걸 추가하는 방법부터 설명드리죠.



메뉴 버튼을 눌러 "계정 설정" 을 선택합니다.



"제공된 키 입력하기" 를 누릅니다. 바코드 스캔을 선택하면 자동으로 카메라가 켜지면서 QR코드를 입력하게 되는데 이 방법은 나중에 별도로 포스팅하겠습니다.




여기에 이렇게 입력을 하는데요, 키 부분은 아무 거나 입력하면 안되고 "애플리케이션 비밀번호"를 사용해야 합니다.


내용추가: secret key는 Base32 인코딩된 10바이트 랜덤 문자열입니다. 관련 포스트는 아래 링크 참조.

Google OTP 용 secret 생성 코드(파이썬)



https://accounts.google.com/b/0/IssuedAuthSubTokens 에 접속합니다. 구글 계정(지메일 계정)이 있어야 하고 이미 접속한 상태라고 할지라도 암호를 한번 더 물어봅니다.




아래쪽에 보시면 "애플리케이션 비밀번호" 라는 게 있는데 여기에 dev-test를 입력하고 "비밀번호 생성"을 클릭.

참고로 이 이름은 그냥 식별자에 불과하며 위의 GOTP에 입력한 이름하고는 달라도 됩니다.




여기에 secret code 가 나옵니다. "완료"를 클릭하면 창이 닫히고 그 뒤에는 저 비밀번호를 다시 볼 수 없으니 누르기 전에 저 코드를 어디에 복사해 두어야 합니다.


이제 애플리케이션에서 GOTP를 사용해봐야겠죠. 파이썬 모듈인 onetimepass 모듈을 사용해보겠습니다.


https://github.com/tadeck/onetimepass

(문서 페이지: http://otp.readthedocs.org/en/latest/ )

$ sudo pip install onetimepass

이렇게 인스톨하셔도 되고


$ git clone https://github.com/tadeck/onetimepass.git

$ cd onetimepass/

$ sudo python setup.py install


이렇게 인스톨하셔도 됩니다.


파이썬 REPL로 간단하게 테스트해보죠.

$ python

Python 2.7.3 (default, Apr 10 2013, 06:20:15) 

[GCC 4.6.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import onetimepass as otp

>>> otp.valid_totp('123456', 'cypuribxkxbfplde') # 1

False

>>> otp.valid_totp('867733', 'cypuribxkxbfplde') # 2

True

>>> otp.valid_totp('867733', 'cypuribxkxbfplde') # 3

True

>>> otp.valid_totp('867733', 'cypuribxkxbfplde') # 4

False

>>> otp.valid_totp('425709', 'cypuribxkxbfplde') # 5

True

>>> 


#1 : 명백히 틀린 코드로 인증 시도 : False

#2 : 현재 시각의 OTP 를 입력 : True

#3 : GOTP가 갱신되기 전에 같은 코드로 인증 시도 : True

#4 : GOTP가 갱신된 직후에 인증 시도 : False

#5 : 갱신된 OTP 입력 : True


보시면 아시겠지만 구글 계정 정보는 입력하지 않습니다. cypu로 시작하는 '애플리케이션 비밀번호'가 일종의 애플리케이션 키 역할을 합니다. 구글 계정하고는 완전히 따로 작동하는 것이기 때문에 설령 여러분이 애플리케이션 비밀번호를 '취소' 해서 키를 삭제한다고 하더라도 이 애플리케이션의 OTP인증은 그대로 동작합니다. 즉 구글 계정과 연동하는 게 아닙니다.

GOTP도 구글 계정하고는 상관없이 작동하는 것이고 애초에 네트워크에 연결돼있을 필요도 없는 애플리케이션입니다. GOTP가 GOTP인 이유는 구글에서 만들었기 때문이지 구글 계정이 있는 사람만 사용할 수 있는것도 아닙니다. 물론 구글 계정이 없는 사람은 저 "애플리케이션 비밀번호"를 다른 방법으로 얻어내야겠죠.


여러 사용자를 회원가입 받아 각각을 otp로 인증하고자 할 때에는 저 secret 부분을 ID와 엮어서 DB에 넣어두면 됩니다. 당연히 secret가 유출되면 해커가 자신의 GOTP에 그걸 등록해서 남의 계정을 막 털어먹을 수 있게 되므로 키관리에 각별히 주의해야 합니다. secret 키를 복호 가능한 암호화를 시켜서 저장하는 등 상상할 수 있는 모든 방법을 동원해서 키 유출을 방지하시기 바랍니다.


참고로 secret는 어떤 특별한 규칙에 따라 생성되는 것으로 보이며 랜덤 문자열을 입력하면 에러를 냅니다. 그래서 구글의 '애플리케이션 비밀번호'를 사용했습니다.


위의 키 관리상의 취약점 때문에 ID와 OTP만 사용하는 인증 방법은 위험하며 패스워드와 병행하여 2단계 인증으로 사용하는 걸 권장합니다.


혹시 뭘 해도 False가 뜨는 사람은 서버 시계(파이썬이 실행중인 컴퓨터의 시계)가 틀린 것이니 NTP등으로 서버 시각을 정확히 맞추시기 바랍니다. 일회용인 ntpdate보다는 항상 시각을 동기화해주는 NTP를 사용하는 것이 좋습니다. 그리고 서버 시계는 로컬 타임이 아니라 UTC에 맞추셔야 한다는거. 서버의 바이오스 타임은 UTC에 맞추고 별도의 타임존 세팅을 통해 로컬 타임을 얻는 게 서버 시각을 설정하는 올바른 방법입니다.

휴대폰은 CDMA프로토콜의 특성상 항상 정확한 시계를 사용하니 휴대폰 시계는 확인할 필요가 없습니다.


혹시 GOTP 앱을 사용하지 않고 자체적인 모바일 클라이언트를 만들려는 분은 위의 onetimepass 모듈의 get_totp() 메서드를 사용하면 됩니다. 이런 식이죠.


>>> otp.get_totp('cypuribxkxbfplde')

981370

>>>


이 get_totp는 매 30초마다 다른 값이 출력됩니다. 마지막 호출 이후 30초가 아니라 매시 매분 25초와 55초 시점에서 갱신됩니다. 따라서 14:35:50에 메서드를 호출했다면 출력 결과가 유효한 시간은 14:35:55까지. 즉 겨우 5초입니다.

간혹 여섯 자리 숫자가 아니라 다섯 자리 이하의 숫자가 뜰 때도 있는데 앞부분이 0이라 그렇게 된 겁니다. 따라서 그냥 사용하지 마시고 꼭 여섯 자리 숫자로 출력될 수 있게 적절한 print 포매팅을 하시기 바랍니다.



출처: http://sojakzi.tistory.com/253 [소작지프로젝트]