近日要对客户的数据库进行测试,其中一项就是使用不同用户权限去测试,由于数据库来自客户,密码是加密过的,其实就是的使用SHA1简单的Hash一下,方法就是直接用.NET框架提供的,如下:
FormsAuthentication.HashPasswordForStoringInConfigFile(strPassword,"SHA1");
现在要把用户的密码替换成我们自己的填写的密码进行测试,想当然的是用.NET提供的方法去做一个小工具了,可在WinForm中可没有FormsAuthentication.HashPasswordForStoringInConfigFile,但有System.Security.Cryptography可以使用,于是就有如下代码:
private void btnHash_Click(object sender, EventArgs e)
...{
string strPassword = this.txtPassword.Text.ToString();
string strHashCode = "";
SHA1 sha1 = new SHA1CryptoServiceProvider();
UTF8Encoding utf = new UTF8Encoding();
byte[] byteA1 = utf.GetBytes(strPassword);
byte[] byteA2 = sha1.ComputeHash(byteA1);
sha1.Clear();
foreach (byte byteTmp in byteA2)
...{
strHashCode += Convert.ToString(byteTmp, 16);
}
strHashCode = strHashCode.ToUpper();
if (strPassword != "")
...{
this.txtHashCode.Text = strHashCode;
}
}但是,发觉Hash出来的字符串很多时候都不够40位,和在WEB中得出的字符串不一致,后来把每个散列的字符串逐一列出来才发觉,有些转换成16进制是“0X”,就直接是“X”,那个“0”就消失,呵呵,真是麻烦,只好自己手动填充一下了 :)
// PadLeft(2,'0 ) 填补转换后少取一位 "0"
strHashCode += Convert.ToString(byteTmp, 16).PadLeft(2, '0') ;
本文介绍了一种使用SHA1算法生成密码Hash值的方法,并解决了在.NET环境下生成的Hash值长度不足的问题。通过手动填充十六进制字符串的方式确保了Hash值的一致性。
2964





