我有一个SHA1CryptoServiceProvider
使用ComputeHash
方法创建密码的对象:
private static byte[] GetSHA1(string userLogin, string userPassword)
{
SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
return sha.ComputeHash(System.Text.Encoding.ASCII.GetBytes(userLogin + userPassword));
}
然后我得到 byte[20] 对象保存我的加密密码。我使用带有参数的 SqlCommand 将其保存到数据库中:
command.Parameters.AddWithValue("@usrPassword", securePassword);
并将 @usrPassword 参数粘贴到 SQL INSERT 查询中。
当用户登录系统时,我byte[20]
从数据库中检索对象并将其与登录表单中提供的值进行比较。一切正常,除非用户在注册时使用撇号创建登录名(如 O'Hara)。由于某种奇怪的原因,数据库以byte[4]
表格形式存储了这些密码,因此它们没有通过比较,用户无法登录。
在我看来,SqlCommand
每当它在名称中保存带有撇号的用户时,它就像切断了字节 [] 对象的一部分,因为securePassword
注册时的变量由字节 [20] 表示,但每当从数据库中检索到相同的数据时,它的字节 [4]。
我使用 SQL Express 2008,密码字段是varbinary(20)
类型。