Appearance
Account Key
VirMesh の account recovery key、通称 Account Key の形式と生成・検証ルールをまとめます。
Account Key はオフラインで安全に保管できる recovery secret です。紙への書き出しやパスワードマネージャーへの保存を想定しています。
Account Key v1
Account Key v1 は28文字です。内訳は26文字のデータ部と2文字のチェックサムです。データ部は128bitのエントロピーを持ち、チェックサムは入力ミスを検出します。
1. 表示形式
text
MV1-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXMV1-はバージョン識別子で、秘密ではないXは後述の32文字アルファベット- 実際のキー本体は 28 文字
- 表示時は 4 文字ごとに
-区切り、7 グループすべて 4 文字
例:
text
MV1-K7HD-Q4TN-9XCF-MR2Y-W8JP-6BXY2. 使用文字集合
text
ABCDEFGHJKLMNPQRSTUVWXYZ23456789- 32文字固定
I,O,0,1は使わない- 大文字のみ表示
- 入力時は小文字を許可して uppercase 化してよい
I/O/0/1 を除外し、視覚的に類似する文字の混同を減らしています。
3. 内部構造
text
D0 D1 ... D25 C0 C1D0..D25: ランダムデータ 26文字 = 128bitC0..C1: チェックサム 2文字 = 10bit
text
28文字 = 26文字の秘密 + 2文字のチェック4. 生成ルール
4.1 ランダムデータ生成
- CSPRNG で 128bit 生成
- 5bit ごとに区切って 26 個の値
0..31にする(末尾の 2bit は未使用) - 各値を文字集合に対応させて
D0..D25を作る
4.2 チェックサム生成
raw_data_bits を 128bit のまま使って、次を計算:
text
checksum_source =
SHA-256("virmesh-recovery-key-v1-checksum" || raw_data_bits)checksum_sourceの先頭 10bit を取り出す- 5bit ごとに2分割して
C0..C1にする - 同じ文字集合でエンコード
4.3 最終キー
text
key = D0..D25 || C0..C1表示時だけ 4文字区切りと MV1- を付ける。
5. 正規化ルール
ユーザー入力を受け取るときは必ず:
- Unicode NFKC 正規化
- 英字を大文字化
- 空白・ハイフンを除去
- 先頭が
MV1なら外す - 28文字ちょうどであることを確認
- 文字集合外の文字があれば即エラー
- 最後の2文字のチェックサムを再計算して一致確認
- 一致しなければ鍵導出せずエラー
類似文字の自動補正は実装差分の原因になるため行いません。
6. 鍵導出ルール
26文字のデータ部から 128bit を取り出して raw_data_bits とする。 それをそのまま使わず、HKDF でドメイン分離する。
text
root_seed = HKDF-SHA256(
ikm = raw_data_bits,
salt = "virmesh-recovery-key-v1-root",
info = "",
len = 32
)ID 用秘密鍵シード:
text
identity_seed = HKDF-SHA256(
ikm = root_seed,
salt = "virmesh-ed25519-identity-v1",
info = "",
len = 32
)このシードから Ed25519 鍵ペアを導出する。