ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Authy TOTP 인증 토큰 데이터 백업하기
    Tech. 2020. 7. 26. 23:19
    반응형

    인터넷에서 2FA(2-Factor Authentication) 사용이 일반화 되어가면서 점점 종류가 늘어간다.

     

    보통은 구글 OTP보단 백업 및 복원을 위해 Authy를 사용하는데, 이것도 단점이 하나가 있다.

     

    물론 Authy가 백업, 복원이 가능한 앱이므로 큰 문제는 안되겠지만, 가끔 인증 토큰이 필요한 경우가 있다.

     

    얼마전에 썼던 글 중에 bitwarden (https://xeriars.com/251) 같은 경우도 TOTP (Time-based One-time Password)를

     

    자체적으로 지원하나, 이 기능을 사용하기 위해서는 인증토큰을 백업해두거나, 패스워드 데이터 생성 시

     

    인증토큰도 같이 넣어 주어야 아래와 같이 작동한다.

     

     

     

     

    문제는 Authy에 생각없이 등록할땐 좋았는데, Authy 자체 서버에 인증토큰이 백업되어있을뿐,

     

    이걸 별도로 조회 할 방법이 없어서, bitwarden에 넣고 쓰려면 애로사항이 발생한다. 알수가 없으니....

     

    이 문제뿐만 아니라 Authy 외 다른 앱을 사용하게 될 때도 마찬가지다. 이 경우 등록된 각 사이트마다

     

    전부 재발급 받는 방법말곤 없어서 매우 골치가 아파진다.

     

     

    그래서 인증토큰을 조회 할 수 있는 방법을 찾아봤는데, 다행히 답을 찾았고 현재는 bitwarden에서 사용중이며

     

    등록된 인증토큰도 안전하게 백업해두었다.

     

     

    이제 나와 같은 어려움을 겪지 않도록 많은 이들이 볼 수 있게 글로써 해법을 남겨둔다.

     

    준비물 : Authy 계정, Chrome 브라우저, Authy 계정정보(전화번호)와 일치하는 스마트폰 그리고

    Authy 앱 내부에서 "Allow multi-device"를 켜둘 것. (Settings → Devices)

     

     

    1. Chrome 정도는 설치되있다고 간주하고, 일단 Authy 확장 프로그램을 받기 위해 아래주소로 접속.

    s.xeriars.com/EmPg

     

     

     

     

    2. "Chrome에 추가" 를 눌러 설치한다.

     

     

     

    3. Authy를 실행하고, 인증을 거쳐 2FA 리스트가 나오도록 설정해준다.

    앱 상단에 더 이상 지원되지 않는다고 기술되어있으나, 신경쓰지 않아도 된다. 지금 이 글처럼 인증토큰을

    유출하는 문제 때문에 더 이상 지원되지 않는거니 일단 무시.

     

     

     

     

    4. 일단 2FA 데이터 중 아무거나 하나 클릭한다.

     

     

     

    5. 백업 비밀번호를 입력하라고 나온다. 이건 Authy를 재설치하고 클라우드에서 TOTP 데이터를 복원할때

    입력하는 그 비밀번호이므로, 정확히 입력해준 뒤 Decrypt Account를 클릭

     

     

     

    7. 인증키가 나오면 일단 이제 이것은 설정이 끝났다. 하지만 앱을 닫지 말고 아래단계를 진행한다.

     

     

     

     

    8. chrome://extensions/ 에 접속하여 확장 프로그램 목록을 열고, 오른쪽 상단 "개발자 모드" 를 활성화 

     

     

     

     

    9. "1개 더보기..."를 클릭한다. 아까 앱을 닫았다면 이 메뉴가 뜨지 않으므로 앱을 실행해준 후 시도한다.

     

     

     

    10. 뷰 검사 메뉴에서 "main.html"을 클릭한다.

     

     

     

     

    11. 개발자 도구가 열리면 "Console" 탭으로 이동한다.

     

     

    12. 아래의 코드를 > 표시 된 곳에 입력해준 후 앤터

    var charTable = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
    function quintetCount (buff) {
      var quintets = Math.floor(buff.length / 5)
      return buff.length % 5 === 0 ? quintets : quintets + 1
    }
    
    const encode = function (plain) {
      var i = 0
      var j = 0
      var shiftIndex = 0
      var digit = 0
      var encoded = new Array(quintetCount(plain) * 8)
      /* byte by byte isn't as pretty as quintet by quintet but tests a bit faster. will have to revisit. */
      while (i < plain.length) {
        var current = plain[i]; if (shiftIndex > 3) {
          digit = current & (0xff >> shiftIndex)
          shiftIndex = (shiftIndex + 5) % 8
          digit = (digit << shiftIndex) | ((i + 1 < plain.length) ? plain[i + 1] : 0) >> (8 - shiftIndex)
          i++
        } else {
          digit = (current >> (8 - (shiftIndex + 5))) & 0x1f
          shiftIndex = (shiftIndex + 5) % 8
          if (shiftIndex === 0) i++
        }
        encoded[j] = charTable.charCodeAt(digit); j++
      }
      for (i = j; i < encoded.length; i++) {
        encoded[i] = 0x3d // '='.charCodeAt(0)
      }
      return encoded.join('')
    }
    /* base32 end */
    
    var hexToInt = function (str) {
      var result = []
      for (var i = 0; i < str.length; i += 2) {
        result.push(parseInt(str.substr(i, 2), 16))
      }
      return result
    }
    function hexToB32 (str) {
      return encode(hexToInt(str))
    }
    
    const getTotps = function () {
      var totps = []
      console.warn("Here's your Authy tokens:")
      appManager.getModel().forEach(function (i) {
        var secret = (i.markedForDeletion === false || !i.secretSeed) ? i.decryptedSeed : hexToB32(i.secretSeed)
        console.group(i.name)
        console.log('TOTP Secret: ' + secret)
        totps.push({
          name: i.name,
          secret: secret
        })
        console.groupEnd()
      })
      console.log(JSON.stringify(totps))
      return totps
    }
    getTotps()

     

     

     

    환경에 따라 코드 복사가 어려운 경우 s.xeriars.com/qOX3에 접속한 뒤 복사해서 쓰면 되며, 

    무진장 복잡해보이지만 그냥 복사해서 붙여넣고 엔터만 해주면 되는 작업이다.

     

     

     

     

    13. 끝났다. TOTP 인증 토큰값을 주르륵 뱉어내므로, 이걸로 백업해두거나 타 OTP앱에 활용할 수 있다.

    원하는 데이터도 얻었고 더 이상 필요가 없다면 보안을 위해 앱을 삭제해주자.

     

     

     

     

    14. bitwarden에서 TOTP까지 관리하고 싶으면 조금전에 뽑아낸 인증토큰을 빨간색 네모 쳐둔곳에 입력후

    "저장"해주면 오른쪽에 흐리게 보이는 TOPT 인증번호가 활성화되며 잘 나온다.

     

     

    Authy가 분명 편리하고 백업도 되는 건 사실이지만, 그건 Authy 서버에 되는 것 뿐 사용자가 백업 할 수

    없기 때문에 여태까지 발급된 2FA 토큰은 이렇게 백업해두고, 앞으로 발급될 토큰들은

    차근차근 백업하는 습관을 들이면 토큰 데이터가 날라가서 피눈물 흘릴 일은 없을 것으로 기대한다.

    반응형

    댓글 0

Copyright 2006-2021. Xeriars.com All rights reserved .