SQL Server テーブルに datetime 列がありました。暗号化する必要がありました。そのため、SSMS で varbinary にキャストしました。テーブルを編集し、datetime 型を varbinary に設定して、SQL Server に変換させただけです。それに続いて、それを取り出して暗号化し (中間層の暗号化アルゴリズムを使用)、データベースにプッシュする使い捨ての C# コードを書きました。名前やその他の文字列型の一部の nvarchars についても同じことを行いました。
暗号化されたデータを (NHibernate を使用して) 取り出すときは、varbinary を byte[] に取り出して復号化します。次に、元の値に変換しようとします。
nvarchar-as-varbinary 列は正常に変換されます。たとえば、多くの名前が返されます。
return Encoding.Unicode.GetString(source.FirstName);
ただし、日付を元の形式に戻すのに苦労しています。私は使用しています:
long ticks = BitConverter.ToInt64(source.DateOfBirth, 0);
return new DateTime?(new DateTime(1980, 1, 1).AddMilliseconds(ticks));
これは日付を正しく返していないようです。DateTime にキャストする正しい方法は何ですか?
更新: サンプル値が要求されました。元は 1901 年 1 月 1 日だった datetime を復号化すると、byte[2]=1、byte[3]=109 の byte[] が生成され、その他はすべて 0 になります。別の datetime '1941-04-26' は復号化時、byte[2]=58、byte[3]=242。