[js] Google Authenticator

seokki kwon·2022년 9월 21일
0

Google Authenticator 로 2중보안

OTP(One-Time-Password)

로그인 할 떄마다 1회성 비밀번호를 생성하는 보안 시스템 개발자들이 자신이 개발한 어플리케이션 2차 보안을 위해 Google Authentication 을 많이 사용

OTP((Time-based One Time Password)의 원리

많은 사람들이 OTP 기기와 서버가 통신하는 줄 오해하는데, 실상은 그렇지 않다. OTP 기기와 서버는 모두 같은 알고리즘을 바탕으로 하기 때문에 통신이 필요치 않다. 서버쪽에서 해당 알고리즘으로 Key나 QR코드를 생성해주면 그걸 OTP 기기에 입력해준다. 그러면 기기에서는 그 Key나 QR코드를 기준으로 하여 30~60초 마다 계속하여 새로운 일회용 비밀번호를 생성한다. 그 일회용 비밀번호를 입력하여 서버로 전송하면 서버에서 그 비밀번호가 맞는지 알고리즘으로 확인하는 방식이다. 여기서 OTP 기기를 이용한다는 것은 스마트폰에 있는 Google OTP(Authenticator) 앱을 사용하는 것을 의미한다.
출처:https://www.notion.so/Google-OTP-aaea3fafcfd740c490cc8621b03424dd

원리

서버에서 알고리즘으로 QR코드 생성 -> UI렌더링 -> 기기인식 -> 고유번호 입력 -> 서버에서 알고리즘으로 확인

@levminer/speakeasy 라이브러리를 사용

우선 암호화에 대하여 알아보자

단방향 암호화

  • 입력 데이터나 메세지를 고정된 길이의 값이나 키로 변환
  • 비밀번호에 사용
  • 복호화 불가

시리즈:SHA,MD5

양방향 암호화

대칭키 암호화

  • 암호화 키, 복호화 키 가 같음(현재 timecheck 암호화방식)
  • 외부 노출의 위험이 있음

시리즈:AES,DES,3DES,SEED,ARIA

비대칭키 암호화

  • 서로 다른 두개의 키, 공개키와 개인키를 사용하여 암호화,복호화
  • 공개키로 암호화, 개인키로 해독

알고리즘:RSA,DSA

결론적으로 문제점은 암호화 방식의 문제였음

var secret = speakeasy.generateSecret({length: 20});

공식문서에서는 기본적으로 sha1 방식을 사용한다고함

var url = speakeasy.otpauthURL({ secret: secret.ascii, label: 'Name of Secret', algorithm: 'sha512'});

그런데 url을 생성시 sha512 를 사용하였음
공식문서대로 따라는 했지만 왜 ascil 값을 넣는지 잘모르겠음

우선 이렇게 url과 secret key를 생성하고 url은 UI에 렌더링 해주면된다
그러면 기계에서 해당 URL을 인식하고 6개의 랜덤숫자를 생성
해당 숫자가 사용자에 의해 서버에 입력이 되면 서버에서는 다시 알고리즘으로
해석을 하여 boolean 형태로 반환

  var result = speakeasy.totp.verify({
          secret: user.secretkey, // 공유 비밀키
          encoding: "base32", // 인코딩방식
          algorithm: "sha1", // 알고리즘 방식
          token: 사용자입력값,
        });

사용자 입력값과 공유비밀키를 넣으면 result에 boolean 형태로 반환이 된다.

profile
웹 & 앱개발 기록

0개의 댓글