「公開鍵トークン」とは何ですか?アセンブリの厳密な名前でどのように計算されますか?
6 に答える
「どのように計算されますか」という質問に関しては、SHA1ハッシュです。
ドットネットブログより:
Microsoftは、厳密に名前が付けられたアセンブリの公開鍵のハッシュを使用して、「公開鍵の肥大化」の問題を解決します。これらのハッシュは公開鍵トークンと呼ばれ、厳密に名前が付けられたアセンブリの公開鍵のSHA1ハッシュの下位8バイトです。SHA1ハッシュは160ビット(20バイト)のハッシュであり、ハッシュの上位12バイトはこのアルゴリズムでは単純に破棄されます。
次のように入力して、VS コマンド ラインから PublicKeyToken を取得できます。
sn –T DLLName.dll
完全な公開鍵に基づいて公開鍵トークンを生成する必要がある場合は、次の小さな静的メソッドが機能します。
private static byte[] GetKeyTokenFromFullKey(byte[] fullKey)
{
SHA1CryptoServiceProvider csp = new SHA1CryptoServiceProvider();
byte[] hash = csp.ComputeHash(fullKey);
byte[] token = new byte[8];
for (int i = 0; i < 8; i++ )
token[i] = hash[hash.Length - (i+1)];
return token;
}
ECMA-335から:
この宣言は、完全な公開鍵ではなく、発信者の公開鍵のSHA-1ハッシュの下位8バイトをアセンブリ参照に格納するために使用されます。
アセンブリ参照には、完全な公開鍵または8バイトの「公開鍵トークン」のいずれかを格納できます。どちらも、コンパイル時にアセンブリに署名するために使用されたのと同じ秘密鍵が、実行時に使用されるアセンブリにも署名したことを検証するために使用できます。どちらも存在する必要はなく、両方を保存することはできますが、これは役に立ちません。[根拠:アセンブリ参照に格納されている公開鍵または公開鍵トークンは、参照されているアセンブリと実行時に実際に使用されているアセンブリが、同じ秘密鍵を所有するエンティティによって生成されたことを確認するために使用されます。同じ目的を意図しています。完全な公開鍵は暗号的に安全ですが、参照でより多くのストレージが必要になります。公開鍵トークンを使用すると、検証プロセスをわずかに弱めるだけで、参照を格納するために必要なスペースが削減されます。理論的根拠を終わらせる]
同じ仕様からのハッシュの計算方法(公開鍵トークンは「計算」されていないため、これがあなたが求めているものである可能性があると思います)については、次のようになります。
CLIメタデータを使用すると、アセンブリのプロデューサーはそのアセンブリの暗号化ハッシュを計算し(SHA-1ハッシュ関数を使用)、RSAアルゴリズム(パーティションIを参照)とプロデューサーの公開鍵と秘密鍵のペアを使用して暗号化できます。選択します。この結果(「SHA-1 / RSAデジタル署名」)は、RSAアルゴリズムに必要なキーペアの公開部分とともにメタデータ(§25.3.3)に保存できます。.publickeyディレクティブは、署名の計算に使用された公開鍵を指定するために使用されます。ハッシュを計算するには、署名をゼロにし、ハッシュを計算してから、結果を署名に保存します。
ストロングネーム(SN)署名プロセスは、ストロングネーム署名に標準のハッシュおよび暗号化アルゴリズムを使用します。ほとんどのPEファイルでSHA-1ハッシュが生成されます。そのハッシュ値は、SN秘密鍵でRSA署名されています。検証の目的で、公開鍵は署名されたハッシュ値とともにPEファイルに保存されます。
以下を除いて、PEファイルのすべての部分がハッシュされます。•Authenticode署名エントリ:PEファイルはauthenticode署名できます。authenticationode署名は、PEヘッダーデータディレクトリのオフセット128にある8バイトエントリ(§25.2.3.3の「証明書テーブル」)と、このディレクトリエントリで指定された範囲のPEファイルの内容に含まれています。[注:準拠するPEファイルでは、このエントリはゼロでなければなりません。エンドノート]•StrongNameBlob:CLIヘッダーのオフセット32にある8バイトのエントリ(§25.3.3の「StrongNameSignature」)と、PEファイルのこのRVAに含まれるハッシュデータの内容。8バイトのエントリが0の場合、関連する厳密な名前の署名はありません。•PEヘッダーチェックサム:PEヘッダーWindows NT固有のフィールドのオフセット64にある4バイトのエントリ(§25.2.3.2の「ファイルチェックサム」)。[ノート:準拠するPEファイルでは、このエントリはゼロでなければなりません。エンドノート]
仕様はここから無料でダウンロードできます:http ://www.ecma-international.org/publications/standards/Ecma-335.htm
公開鍵トークンは、厳密に名前が付けられたアセンブリ内の組織を識別するために使用されます。この情報は、アセンブリメタベースに追加されます。リチャードはそれが保存される技術的な方法について正しいと思います。
アセンブリのメタベースを表示する場合は、ILDASMを使用します。ILの表示に加えて、メタベースに格納されているものにドリルダウンできます。
これは、アセンブリの署名に使用されるキーのハッシュバイトです。
したがって、キーの数百の16進数をリストするのではなく、より単純なものがありますが、それでも衝突のリスクはほとんどありません。