カテゴリー: プログラミング

【.NET】アセンブリに関連付けてデータを暗号化するライブラリ

更新情報
2016/09/23 1.0.1を公開

.NETアプリケーションから利用できる暗号化ライブラリを作ってみました。
このライブラリの特徴は、暗号化に使う共通鍵に、ライブラリを呼び出したアセンブリの公開鍵を使うという点です。

アセンブリには電子署名を行うことで「厳密名」を持たせることができます。
その厳密名に含まれる公開鍵を使うことで、データを暗号化してもそれを復号できるのは同じアセンブリのみとなります。

厳密名を付けるには、署名に使う公開鍵と秘密鍵のペアが必要です。
そのうち、秘密鍵は開発者が厳重に管理しているはずですので、秘密鍵は開発者しか分かりません。
アセンブリを読み込む際、そのアセンブリが署名されている場合は付属している公開鍵を使って改ざんの有無を確認し、問題なければアセンブリが読み込まれます。
つまり、データを暗号化したアセンブリを改ざんして暗号化データを抽出しようとしても、秘密鍵を知らないため署名が出来ないので抽出は不可能ということになります。


【C#】リフレクションでの呼び出しを検出・禁止する方法

C#には「リフレクション」という便利な機能があります。
これは、メソッドなどを動的に呼び出したり、インスタンスを動的に生成したりすることができる機能です。

ただ、この機能、実はprivateに設定したメンバも呼び出してしまうことができます。
つまり、他から呼び出されると困るからprivateにしたメソッドがあったとしたら、それを利用者が意図的に呼び出すことが出来てしまう、という訳です。
まあ、利用者がprivateメンバまでクラス構造を理解していないとできませんが。
注意:フィールドおよび構造体の引数なしコンストラクタに対するアクセスを検出する方法はありません。


【C#】ファイルパスの正規化

C#でファイルパスの正規化を行おうと思ったのですが、絶対パスならSystem.IO.Path.GetFullName()で可能ですが相対パスについては上手く動作するコードがなかったので、こちらで作ったコードを公開しようと思います。

一応テスト済みですが、もし不具合があったら教えて頂けると助かります。


【C#】仮想メソッドとif分岐の速度比較

32bitと64bitのDllImport動的切り替えで、どうやって呼び出し先を選択するかと言えば、抽象メソッドと継承を使うかifで呼び分けるかの選択肢がありますが、今回、どちらが早いか実験してみたのでメモしておきます。

1.仮想メソッド方式
メソッドを定義した抽象クラスと、それを呼び出し先DLLごとに分けたサブクラスを作成し、プログラム初期化時に適切な方をnewしてそれを呼び出します。


【C#】System.Lazyクラスの弱参照版

System.Lazyクラスは、オブジェクトの生成に時間がかかる場合などに、必要になった時点で生成を行い、以後生成済みのオブジェクトを使うという機能をスレッドセーフで提供するものです。
今回はそれに弱参照を使って、生成後不要になったら一旦メモリから解放する機能を追加してみました。

ソースコードを以下に置いておきます。
これを使うにはWeakRef<T>クラスが必要なので、一緒に使ってください。
名前空間は変更して頂いて構いません。

https://www.myqnapcloud.com/smartshare/68704567o61n820u6428z5z3_6IiLTtA


弱参照の扱いを簡単にするクラスを作ってみた

C#で弱参照を扱うクラス「System.WeakReference」を使っていて、扱いにくいと思ったので、もっと扱いやすくなるよう独自にクラスを作ってみました。
使いたい方はご自由にお持ちください。
基本usingしなくても使えるよう名前空間がSystemになっていますが、気に入らない方はそれぞれ名前空間を変更してください。

http://www.myqnapcloud.com/smartshare/68704567o61n820u6428z5z3_6h1wEPX