C# Programming

Imageアセンブリへの署名とGAC

1.目次

2.目的

注意

このセクションは、自分自身のためのメモです。

このあたりのアセンブリー、DLL地獄の解消、厳密名の署名などなどに関しては、とてもHPで説明しきれる内容ではないです。
また、下手に説明してしまうのも非常に危険な話なので、解説しません。
それぞれの環境ごとにやり方が異なってきますので、参考にしないでね。

厳密名アセンブリーにすることにより、改竄からプログラムを守ることができます。
厳密名署名されたアセンブリーを改竄すると、次のようなエラーが表示され、実行できなくなります。
本当にあなたが作ったアセンブリーであることを保証したい場合には、厳密名アセンブリーにするのがよいでしょう。
相当奥深い内容なので、頑張ってね^^;

Image


3.参考

(1) MSDN/ .NET Framework を使った簡単な配置と DLL Hell の解決
(2) MSDN/ .NET Framework のための安全なコーディング ガイドライン
(3) MSDN/ Visual Studio .NET と Visual SourceSafe を使用したチーム開発

4.用語

用語説明
CSPCrypto Service Provider / 暗号サービス プロバイダ
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider 
CSPコンテナ暗号サービス プロバイダ自体が管理するコンテナ

5.キーペアの作成、および厳密名の署名

秘密鍵、公開鍵のキーペア作成

手順 処理 説明
Step 1キーペア(秘密鍵、公開鍵)を作成する。sn -k Uchukamen_Master.snk
Step 2キーペアを CSP に格納する。sn -i Uchukamen_Master.snk Uchukamen_CSP

注意 注意 注意 注意 注意 注意 注意 
キーペアは、厳重に保管すること。

AssemblyInfo.cs の設定

手順

処理

説明

Step 1

AssemblyInfo.cs の一般情報を確認する。

[assembly: AssemblyTitle("アセンブリーのタイトル")]
[assembly: AssemblyDescription("アセンブリーの説明")]
[assembly: AssemblyConfiguration("アセンブリ構成情報")]
[assembly: AssemblyCompany("Uchukamen")]
[assembly: AssemblyProduct("製品名")]
[assembly: AssemblyCopyright("Copyright (c) 2003 Uchukamen")]
[assembly: AssemblyTrademark("Uchukamen")]
[assembly: AssemblyCulture("")]

Step 2

AssemblyInfo.cs のバージョンを確認する。

[assembly: AssemblyVersion("1.0.*")]

Step 3

AssemblyInfo.cs の署名を確認する。
CSP を利用する場合

[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("")]
[assembly: AssemblyKeyName("Uchukamen_CSP")]

AssemblyInfo.cs の署名を確認する。
キーペアを利用する場合

[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("..\\..\\Uchukamen_Master.snk")]
[assembly: AssemblyKeyName("")]

注意 AssemblyCulture 

通常は空文字列""

注意 Version <メジャー番号>.<マイナー番号>.<ビルド番号>.<リビジョン番号>
ワイルドカード (*) を使用して、ビルド番号とリビジョン番号を自動的に生成できる。

バージョン

ガイドライン

補足

メジャー番号

下位互換性を想定できない製品のメジャー リリースなど。

手動で設定。

マイナー番号

下位互換性はあるが大幅な改良を行った場合など。

手動で設定。

ビルド番号

同一ソースの再コンパイルが行われた。例えば、プロセッサ、プラットフォーム、コンパイラなどが変更された場合。

*とした場合、2000年からの日数らしい

リビジョン番号

完全互換。前のリリースのアセンブリのセキュリティ ホールを修正する場合など。

*とした場合、リビジョン番号は深夜0時からの秒数÷2らしい

注意 Version 

ビルド番号、リビジョン番号を手で設定することも可能だが、 同一のバージョン番号を持つdll がすでに GAC に存在する場合、最新のdll はインストールされない。

その他メモ

項目

コマンド

公開鍵の取得: キーペアを利用

sn -p Uchukamen_Master.snk Uchukamen_Public.snk

公開鍵の取得: CSP を利用

sn -pc Uchukamen_CSP Uchukamen_Public.snk

逆アセンブラ

ILDASM.exe

Image

6.GAC関連ツール

項目コマンド
GACの管理(追加、削除など).Net Framework Configration
コントロールパネル→管理ツール→.Net Framework Configration→マイコンピュータ→アセンブリキャッシュ

Image
アセンブリの依存関係の確認.Net Framework Configration
コントロールパネル→管理ツール→.Net Framework Configration→マイコンピュータ→アプリケーション

Image
.NET Global Assembly Cache Utilitygacutil.exe
コマンドラインツール。英語ベースで使いにくい。.Net Framework Configrationで十分。

その他メモ

項目

コマンド

GAC の格納場所

%windir%\assembly

アセンブリの命名規則

<会社名>.<テクノロジー名>.<カテゴリー名>.dll

Uchukamen.CSharp.Util.dll
GAC に登録するには、ファイル名(".dll を除く")はアセンブリ名と一致している必要がある。
個人ベースなら、GACに登録することなんてありえないと思うけど、とりあえず。^^/~