구글 인증기(Google Authenticator)에서 다른 인증기로 마이그레이션하기

구글 인증기(Google Authenticator)에서 다른 인증기로 마이그레이션하기

구글 인증기(Google Authenticator)는 OTP(One-Time Passcode, 일회용 인증코드) 앱 중 하나로, 먼 옛날부터 널리 사용된 앱이다.

먼 옛날엔.. 구글 인증기에 있는 OTP들을 옮길 수 없었다. 그래서 핸드폰을 바꾸면 모든 OTP를 다시 등록해야 하는 번거로움이 있었다. 그나마 최근에는 내보내기도 추가되고, 구글 계정에 백업도 된다.

구글 계정에 락인되는게 싫다거나, ente auth 등 데스크탑, 웹 등 여러 환경을 지원하는 인증기를 쓰고 싶다면 옮기는 것도 방법이다.

이번 글에서는 구글 인증기에 있는 OTP를 다른 인증기로 마이그레이션 하는 과정을 알아보겠다.

구글 인증기 OTP 내보내기

왼쪽 상단 메뉴 - Transfer accounts - Export accounts를 클릭한다

내보낼 계정들을 선택하면 QR코드가 나온다.

계정을 하나만 선택하면, QR 코드의 내용은 아래 형식으로 나올 것이다.

otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example

이 경우엔 QR코드 이미지를 모니터에 띄운다던가 해서, 새 인증기에서 다시 스캔해 등록하면 된다.

migration URI 변환

2개 이상의 계정을 내보내는 경우, URI 형식이 달라지기 때문에 다른 인증기(ex. Ente Auth, Bitwarden 등)에 옮기려면 추가 작업이 필요하다.

아래는 URI 형식 예시이다.

otpauth-migration://offline?data=YTQ3ZGE2ZTI2NWY3ODAyN2M0MjZjYTg1NTlkMzk2ODE0MGVhNTgzOWFmZGVlZWY3NThjMzkxMTczOGYyZTRiY2QxYjYzOGE4MDIyOTcwOTY4Zjk5ZjUyZGQyNjdhODg4NmZjNzBiZWFlOTFhYzYwZmI4MTUwMjNiYTZmM2VhMjA/eLB%MTY5NzcwYjhhNWM1ZDgyZGNlOTA4OTJkNTYyMDcyMTk2NGFiODNmNjUxMmI0OTIyZTE1Zjk1YTQ0N2Y2MWE1N2U2MmMwM2FkNGUyYWI2YmU4ZjQ5ZTc5MTY4NThjNjBlMjY5Yzg3MmEyNDJjOWNhYzQ1NzJlMGI5MTk2MDE3Y2Y/NzNjYjA5MDAzYzljYzV//OGMyMzRkZDRiYzdiN2UxZGE5OTUzNWFjYWYxMjgwNGQ0NzIxYjYzMWIxM2RjMTVhYTBmZmJlN2UxZmJiMDkwODZkZWM3YTI3Yjk0ZDYxMTI3ZGYyODk3MTJhMGZhM2NjNDk3NzA5OTY5NjNlNGI4NGI3ZDllYzk2OGRkMzg2NmY/MWZiN2ViYjk4MTQwNTA4NjhjYmE5YmQzNTc0ZjA2YWNkYTI1MDA4MWYwZjhkM/NTc0YzFiMTVkNmJkZmExMDk2NTkxZTVjNWQwYWUzMGNhNmU1YTM4M2QyNWI0NjYyODNlOTExNmY0YmJlMTFlOGI4YWUyYjhjMTBiMzIzZWM2ZjViYTBlZmI3YTcyM2YyNTYxMjQxNjNhNjI5NjZmODgyZDYyNzQ1MjZhYzIyNzg%3D

일단 여러장의 migration QR코드를 전부 받아서 복사한다. QR코드 -> 텍스트 디코딩은 어렵지 않으니 생략한다.

그 다음, 아래 프로젝트를 이용해 optauth-migration URI를 디코딩한다.

아래처럼 실행하면, otpauth://totp/... 형식의 URI를 QR 코드로 만들어 png 파일로 만들게 된다.

otpauth -qr -link "otpauth-migration://offline?data=TI2NWY3ODAyN2M0MjZj..."

마지막으로 생성된 QR 코드 이미지 파일들을 새 인증기에서 하나씩 스캔하면 된다.

부록

otpauth URI

TOTP, HOTP에 사용되는 URI는 사실 지금까지 표준이 없어서 provider와 client마다 구현이 대동소이했다. 대략적 형식은 아래와 같다

otpauth://TYPE/LABEL?PARAMETERS

2023년에 RFC Internet Draft가 올라온 상태다. 링크는 참고자료에 걸어뒀다.

otpauth-migration URI

구글 인증기에서 otpauth-migration://offline?data=... 형식 URI에서 data는 base64 인코딩된 protobuf message인데, 형식은 아래와 같다

syntax = "proto3";

message MigrationPayload {
  enum Algorithm {
    ALGORITHM_UNSPECIFIED = 0;
    ALGORITHM_SHA1 = 1;
    ALGORITHM_SHA256 = 2;
    ALGORITHM_SHA512 = 3;
    ALGORITHM_MD5 = 4;
  }

  enum DigitCount {
    DIGIT_COUNT_UNSPECIFIED = 0;
    DIGIT_COUNT_SIX = 1;
    DIGIT_COUNT_EIGHT = 2;
  }

  enum OtpType {
    OTP_TYPE_UNSPECIFIED = 0;
    OTP_TYPE_HOTP = 1;
    OTP_TYPE_TOTP = 2;
  }

  message OtpParameters {
    bytes secret = 1;
    string name = 2;
    string issuer = 3;
    Algorithm algorithm = 4;
    DigitCount digits = 5;
    OtpType type = 6;
    int64 counter = 7;
  }

  repeated OtpParameters otp_parameters = 1;
  int32 version = 2;
  int32 batch_size = 3;
  int32 batch_index = 4;
  int32 batch_id = 5;
}

https://alexbakker.me/post/parsing-google-auth-export-qr-code.html

원본 proto definition이 공개되어 있지 않기 때문에, 어느정도 구성한 것이긴 하지만 웬만하면 맞을 것이라고 한다.

참고자료