-1

我在 SQL Server 表中有一个日期时间列。我们需要对其进行加密。因此,我将其转换为 SSMS 中的 varbinary。我只是编辑了表格,将日期时间类型设置为 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 日的日期时间在解密时会产生一个 byte[],其中 byte[2]=1 和 byte[3]=109,而所有其他的都是 0。另一个日期时间 '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 回答