DID Placeholder (did:plc)
進行中の作業
このドキュメントは完全ではありません。 更新のため、近日中に再度ご確認ください。
DID プレースホルダーは、暗号化された強力な一貫性を備えた回復可能なDIDメソッドです。 モチベーション
既存の DID メソッドのいずれにも完全に満足できなかったため、DID プレースホルダーを導入しました。私たちは、安価で高速な更新の伝播を伴う、一貫性が高く、可用性が高く、回復可能で、暗号的に安全な方法を求めていました。
私たちはこのメソッドを "Placeholder"「プレースホルダー」という生意気なタイトルを付けました。中央集権化されていないものに置き換えることを積極的に望んでいます。今後数年以内に、適合する方法が現れDID コンソーシアムで認可される可能性が高いことを期待しています。
仕組み
これは完全に表現力豊かな DID 形式ではありません。 DID 仕様に準拠していますが、ドメイン固有であり、特定のデータ型を特定の方法で表すことしかできません。 将来的には、より一般的なものに拡張される可能性があります。
各 DID ドキュメントは、(現時点では) 4 つのデータのみで構成されています。
signingKey
recoveryKey
username
atpPds (関連する AT Protocol リポジトリの Personal Data Server)
DID ドキュメントは、署名された操作のログから派生し、PLC サーバーによって順序付けられます。
各ログには 5 つの操作があります:。create, rotate_signing_key, rotate_recovery_key, update_username, and update_atp_pds.
各操作の形状は次のとおりです。
code:js
type Operation = {
type: string // operation type
prev: CID | null // ログのひとつ前の operation CIDへのポインタ
sig: string // base64url エンコードされた operation の署名
... // その他の operation 関連データ
}
各操作には、ログ内の直前の操作への参照が含まれており、signingKey または recoveryKey によって署名されています。
DID 自体は、ログ内の最初の操作の sha256 ハッシュから取得されます。その後、base32 でエンコードされ、24 文字に切り捨てられます。
図にする: did:plc:${base32Encode(sha256(createOp)).slice(0,24)}
オペレーションは、PLC サーバーによって検証、順序付け、および使用可能になります。
PLC サーバーの機能には制限があります。オペレーションログは、順序を除いて完全に自己認証されます。
したがって、PLC サーバーの攻撃は次のように制限されます。
サービス拒否: 有効な操作の拒否、または DID に関する情報の提供の拒否
順序の誤り: DID ドキュメントの履歴にフォークが発生した場合、サーバーは「間違った」フォークを提供することを選択できます。
署名と回復キー
signingKeyとrecoveryKeyの両方が、DIDドキュメントを変更する権限を持っています。ただし、これらのキーは等しくありません。
サンプル ドキュメント (以下) でわかるように、アサーションを作成し、機能を呼び出し/委任する機能が付与されているのはsigningKey のみです。
一方、回復キーは「回復操作」を実行できます。
アカウントの復元
PLC サーバーは、 recoveryKeyが履歴を「書き換える」ことができる 72 時間の猶予を提供します。
これは、ユーザーのsigningKey情報が漏えいしたり、悪意のある人物であることが判明した保管人によって保持されたりする敵対的な状況で使用されます。
このような状況では、 recoveryKeyを使用して signingKeyとrecoveryKeyの両方を交換させることができます。
ユーザーがこの状況から回復したい場合は、signingKeyを保持しているキーに入れ換える新しい操作に署名し、その操作のprevを攻撃前の最新の操作を指すように設定します。
例#
次の操作ログを検討してください。
code:json
[
{
type: 'create',
signingKey: 'did:key:zDnaejYFhgFiVF89LhJ4UipACLKuqo6PteZf8eKDVKeExXUPk',
recoveryKey: 'did:key:zDnaeSezF2TgCD71b5DiiFyhHQwKAfsBVqTTHRMvP597Z5Ztn',
username: 'alice.example.com',
prev: null,
sig: 'vi6JAl5W4FfyViD5_BKL9p0rbI3MxTWuh0g_egTFAjtf7gwoSfSe1O3qMOEUPX6QH3H0Q9M4y7gOLGblWkEwfQ'
},
{
type: 'update_username',
username: 'ali.example2.com',
prev: 'bafyreih2gihqzgq5qd6uqktyfpyxqxvpdnrpu2qunnkaxugbyquxumisuq',
sig: 'KL98ORpGmAJTqDsC9mWAYbhoDIv_-eZ3Nv0YqiPkbgx0ra96gYa3fQhIpZVxXFyNbu_4Y3JhPCvyJb8yDMe9Sg'
},
{
type: 'update_atp_pds',
prev: 'bafyreickw7v7mwncrganw645agsmwjciolknt4f6f5an5wt3nrjepqaoiu',
sig: 'AS-APea3xxR5-sq2i5v9IOsgbM5G5qAnB92tExZ8Z4vEy_GQbV8jmfY7zTx76P88AVXInZsO6yWX4UO7_xAIfg'
},
{
type: 'rotate_signing_key',
key: 'did:key:zDnaeh9v2RmcMo13Du2d6pjUf5bZwtauYxj3n9dYjw4EZUAR7',
prev: 'bafyreictfsrkdt5azni355vapqka5a7erqjsa3vv7iaf52yjlqqbzkwgga',
sig: 'VvcCoYVDluLZghv3i6ARyk1r7m1M32BPryJlTma1HTOx2CdbmIOUkVUbFa2LWi571fe-2yjTWY0IEAKfRiPAZg'
},
{
type: 'rotate_recovery_key',
key: 'did:key:zDnaedvvAsDE6H3BDdBejpx9ve2Tz95cymyCAKF66JbyMh1Lt',
prev: 'bafyreiazzldal6642usrcowrpztb5gjb73qla343ifnt5dfbxz4swmf5vi',
sig: 'Um1GVZZT9JgB2SKEbwoF4_Sip05QjH7r_g-Hcx7lIY-OhIg88ZKcN_N4TgzljgBGwe6qZb0u_0Vaq0c-S2WSDg'
}
]
ログは次のドキュメント データを生成します:
code:json
{
did: 'did:plc:7iza6de2dwap2sbkpav7c6c6',
signingKey: 'did:key:zDnaeh9v2RmcMo13Du2d6pjUf5bZwtauYxj3n9dYjw4EZUAR7',
recoveryKey: 'did:key:zDnaedvvAsDE6H3BDdBejpx9ve2Tz95cymyCAKF66JbyMh1Lt',
username: 'ali.example2.com',
}
そして、次の DID ドキュメント:
code:json
{
'@context': [
],
id: 'did:plc:7iza6de2dwap2sbkpav7c6c6',
verificationMethod: [
{
id: 'did:plc:7iza6de2dwap2sbkpav7c6c6#signingKey',
type: 'EcdsaSecp256r1VerificationKey2019',
controller: 'did:plc:7iza6de2dwap2sbkpav7c6c6',
publicKeyMultibase: 'zSSa7w8s5aApu6td45gWTAAFkqCnaWY6ZsJ8DpyzDdYmVy4fARKqbn5F1UYBUMeVvYTBsoSoLvZnPdjd3pVHbmAHP'
},
{
id: 'did:plc:7iza6de2dwap2sbkpav7c6c6#recoveryKey',
type: 'EcdsaSecp256r1VerificationKey2019',
controller: 'did:plc:7iza6de2dwap2sbkpav7c6c6',
publicKeyMultibase: 'zRV2EDDvop2r2aKWTcCtei3NvuNEnR5ucTVd9U4CSCnJEiha2QFyTjdxoFZ6629iHxhmTModThGQzX1495ZS6iD4V'
}
],
service: [
{
id: 'did:plc:7iza6de2dwap2sbkpav7c6c6#atpPds',
type: 'AtpPersonalDataServer',
}
]
}