0

我有一个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)类型。

4

0 回答 0