我在SQL Server表中有一个datetime列。我们需要加密它。因此,我在SSMS中将其转换为varbinary。我只是编辑了这个表,将datetime类型设置为varbinary,然后让SQL Server进行转换。接下来,我编写了简单的c#代码将其拉出,加密(使用中间层中的加密算法)并将其推回数据库。对名称和其他字符串类型的nvarchars做了相同的处理。
当我拉出加密的数据(使用NHibernate),我拉varbinary到一个字节[]和解密它。然后尝试将其转换回原始值。
nvarchar-as-varbinary列转换为fine;例如,我得到5个名字。
return Encoding.Unicode.GetString(source.FirstName);
然而,我很难把日期转换回原来的形式。我使用:
long ticks = BitConverter.ToInt64(source.DateOfBirth, 0);
return new DateTime?(new DateTime(1980, 1, 1).AddMilliseconds(ticks));
这似乎没有正确返回日期。将它转换回DateTime的正确方法是什么?
更新:请求样例值。最初为1/1/1901的日期时间在解密时产生一个byte[],其中byte[2]=1, byte[3]=109,其他都是0。另一个日期时间' 194104-26 '在解密时产生byte[2]=58和byte[3]=242。
日期存储为从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
Int64 ticks = BitConverter.ToInt64(source.DateOfBirth, 0);
DateTime dt = DateTime.FromBinary(ticks);
在您解密varbinary数据之后,您可以获得字符串值并通过SSMS运行它吗?比如:
SELECT CONVERT(datetime, 0x0000A149016D7FD9)
你的varbinary数据在SQL Server中看起来像什么?我怀疑翻译中有什么地方出错了。
好运。