Base32 を Base64 に変換する方法
- 入力 · Base32(RFC 4648)に Base32 を貼り付けます。グループ間の空白、小文字、
=の欠落はどれも問題ありません。 - 出力 · Base64 で Base64 を確認します。送り先が
=を求めない場合は出力の下のパディング(=)のチェックを外し、長い値なら折り返しを設定します。 - 出力をコピーします。方向の切り替えで Base64 → Base32(RFC 4648)を選ぶと逆方向に戻せます。Base64 を Base32 にでも同じです。
例
| Base32 | Base64 | 備考 |
|---|---|---|
JBSWY3DPEHPK3PXP | SGVsbG8h3q2+7w== | Google Authenticator のキー URI ドキュメントにある例のキー、10 バイト |
jbsw y3dp ehpk 3pxp | SGVsbG8h3q2+7w== | 同じキーを、アプリが表示するようにグループ分けしたもの |
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ | MTIzNDU2Nzg5MDEyMzQ1Njc4OTA= | RFC 6238 のテスト用シークレット、ASCII の数字 20 桁 |
RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K | iEwO+V01Llzjb4MxBUtgEuCNW8o= | ランダムに見える 20 バイト |
MZXW6YQ | Zm9vYg== | パディングなしの入力。パディング付きなら MZXW6YQ= |
最初のキーをデコードするとバイト列 48 65 6c 6c 6f 21 de ad be ef になります。Hello! という単語に de ad be ef が続いたものです。その Base64 が Hello! の Base64 である SGVsbG8h で始まるのはこのためです。
2 段階認証のシークレットを Base64 に変換する理由
Base32 の形は人間のためにあります。QR コードや設定画面に載せ、スマートフォンで入力できるようにするものです。一方、コードや設定ファイルが求めるのはたいてい生の鍵で、JSON、YAML、環境変数、データベースに生のバイト列を保存する一般的な方法が Base64 です。典型的なケース:
- エクスポートした
otpauth://リンクの一覧から、シークレットを Base64 で保存するシステムへ TOTP アカウントを移す。 - 自前のサーバーでコードを検証する場合など、Base64 やバイト列を受け取る HMAC の関数やライブラリに鍵を渡す。
- シークレットの 2 つのコピーを比較する。同じ Base32 なら、グループ分け、大文字小文字、パディングが違っても Base64 は 1 つの文字列になるので、出力が同じなら鍵も同じです。
Base64 のシークレットは Base32 のものとまったく同じだけ機密性が高いので、パスワードを保管するような場所に保管してください。
Python で Base32 を Base64 に変換する
Python の b32decode は大文字小文字とパディングに厳格なので、先に文字列を正規化します。
import base64
def b32_to_b64(secret):
s = secret.replace(" ", "").upper()
s += "=" * (-len(s) % 8)
return base64.b64encode(base64.b32decode(s)).decode()
b32_to_b64("jbsw y3dp ehpk 3pxp") # 'SGVsbG8h3q2+7w=='
.upper() の呼び出しがないと Python は binascii.Error: Non-base32 digit found を出し、パディングの行がないと Incorrect padding を出します。Base64 側については Python での Base64 をご覧ください。
よくある問題
9、8、1、0の位置でエラーになる。 これらの数字は RFC 4648 の Base32 にはありません。値はおそらく base32hex か Crockford です。たとえば91IMOR3Fはここでは位置 1 で失敗します。正しい変換元のアルファベットを選んで Base32 デコーダーでデコードしてください。-の位置でエラーになる。 キーをハイフンで区切って表示するサイトがあります。ハイフンを取り除いてください。読み飛ばされるのは空白だけです。- Base64 は正しいのにサーバーがコードを拒否する。 他のパラメーターを確認してください。アルゴリズム、桁数、周期が両側で一致している必要があり、サーバーの時計がスマートフォンの時計とほぼ合っている必要もあります。
よくある質問
Google Authenticator のキーを Base64 に変換するにはどうすればいいですか?
otpauth:// リンクの secret= パラメーターからキーを取り出し(または QR コードの下に表示されるテキストのキーを使い)、ここに貼り付けます。JBSWY3DPEHPK3PXP は SGVsbG8h3q2+7w== になります。
Base64 のほうが Base32 より短いのはなぜですか?
Base64 は 1 文字に 6 ビット、Base32 は 5 ビットを格納するので、同じバイト列でも Base64 のほうが少ない文字数で済みます。20 バイトは Base32 では 32 文字ですが、Base64 では 28 文字です。
base32hex や Crockford Base32 もここで変換できますか?
このページが読むのは RFC 4648 の Base32 だけです。Base32 デコーダーを開き、変換元を Base32hex か Crockford Base32 に、変換先を Base64 にしてください。
コマンドラインで Base32 を Base64 に変換するには?
GNU coreutils なら printf 'JBSWY3DPEHPK3PXP' | base32 -d | base64 です。入力は空白なしの大文字である必要があるので、先に tr -d ' ' | tr a-z A-Z で整えてください。