Authy TOTP 인증 토큰 데이터 백업하기

인터넷에서 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 토큰은 이렇게 백업해두고, 앞으로 발급될 토큰들은

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

댓글 남기기