我在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的正确方法是什么?
更新:请求了样本值。最初为1/1/1901的日期时间,当解密时,产生一个byte [],其中byte [2] = 1,byte [3] = 109,其他所有为0.另一个datetime'1941-04-26'产生解密后,byte [2] = 58,byte [3] = 242。
答案 0 :(得分: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
答案 1 :(得分:0)
Int64 ticks = BitConverter.ToInt64(source.DateOfBirth, 0);
DateTime dt = DateTime.FromBinary(ticks);
答案 2 :(得分:0)
解密varbinary数据后,你能获得字符串值并通过SSMS运行吗?类似的东西:
SELECT CONVERT(datetime, 0x0000A149016D7FD9)
您的varbinary数据在SQL Server中是什么样的?我怀疑翻译中有些东西搞砸了。
祝你好运。