我在 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 解密。