我有一个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
只要在名称中保存带有撇号的用户时就会截断byte []对象的一部分,因为securePassword
变量在注册时由byte [20]表示,但每当从数据库中检索相同的数据[4]。
我使用SQL Express 2008,密码字段属于varbinary(20)
类型。