-1

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。

4

3 に答える 3

1

日付は、1900-01-01からの日数として保存されます。

例:

byte[] data = {0,0,58,242};

if (BitConverter.IsLittleEndian) {
  Array.Reverse(data);
}
int days = BitConverter.ToInt32(data, 0);
DateTime date = new DateTime(1900, 1, 1).AddDays(days);

Console.WriteLine(date);

出力:

1941-04-26 00:00:00
于 2013-01-18T09:07:58.050 に答える
0
Int64 ticks = BitConverter.ToInt64(source.DateOfBirth, 0);
DateTime dt = DateTime.FromBinary(ticks);
于 2013-01-18T02:17:04.310 に答える
0

varbinary データを復号化した後、文字列値を取得して SSMS で実行できますか? 何かのようなもの:

SELECT CONVERT(datetime, 0x0000A149016D7FD9)

varbinary データは SQL Server でどのように見えますか? 翻訳で何かがめちゃくちゃになっていると思います。

幸運を。

于 2013-01-18T04:02:26.857 に答える