web-dev-qa-db-ja.com

公開鍵トークンとは何ですか?アセンブリの厳密な名前でどのように計算されますか?

「公開鍵トークン」とは何ですか?アセンブリの厳密な名前でどのように計算されますか?

24
Praveen Sharma

「どのように計算されますか」という質問に関しては、SHA1ハッシュです。

から ドットネットブログ

Microsoftは、厳密に名前が付けられたアセンブリの公開鍵のハッシュを使用して、「公開鍵の肥大化」の問題を解決します。これらのハッシュは公開鍵トークンと呼ばれ、厳密に名前が付けられたアセンブリの公開鍵のSHA1ハッシュの下位8バイトです。 SHA1ハッシュは160ビット(20バイト)のハッシュであり、ハッシュの上位12バイトはこのアルゴリズムでは単純に破棄されます。

16
Cerebrus

次のように入力すると、VSコマンドラインからPublicKeyTokenを取得できます。

sn –T DLLName.dll
11
Saurabh Kumar

完全な公開鍵に基づいて公開鍵トークンを生成する必要がある場合、この小さな静的メソッドは機能します。

   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;
    }
6
Todd Kobus

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ファイルでは、このエントリはゼロでなければなりません。エンドノート]•StrongName Blob:CLIヘッダーのオフセット32にある8バイトのエントリ(§25.3.3の「StrongNameSignature」)およびこのRVAに含まれるPEファイルのハッシュデータの内容。 8バイトのエントリが0の場合、関連する厳密な名前の署名はありません。 •PEヘッダーチェックサム:PEヘッダーWindows NT固有フィールドのオフセット64にある4バイトのエントリ(§25.2.3.2の「ファイルチェックサム」)。 [注:準拠するPEファイルでは、このエントリはゼロでなければなりません。エンドノート]

ここから無料で仕様をダウンロードできます: http://www.ecma-international.org/publications/standards/Ecma-335.htm

5
mletterle

公開鍵トークンは、厳密に名前が付けられたアセンブリ内の組織を識別するために使用されます。この情報は、アセンブリメタベースに追加されます。リチャードはそれが保存される技術的な方法について正しいと思います。

アセンブリのメタベースを表示する場合は、ILDASMを使用してください。 ILの表示に加えて、メタベースに保存されているものにドリルダウンできます。

3

これは、アセンブリの署名に使用されるキーのハッシュバイトです。

したがって、キーの数百の16進数をリストするのではなく、より単純なものがありますが、それでも衝突のリスクはほとんどありません。

0
Richard