C#SHA1算法及注意事项
程序员文章站
2022-05-12 20:32:09
...
要求:使用hash算法SHA-1计算字符串的hash值,得到16进制形式的字符串(共40个字母),并全部转换为英文字母大写形式。
上面的要求也就是标准SHA1的结果再转为大写
SHA1在线加密算法工具:http://tool.oschina.net/encrypt?type=2
多种工具
几种算法略微差别
C#算法:
方法一:
/// <summary>
/// 基于Sha1的自定义加密字符串方法:输入一个字符串,返回一个由40个字符组成的十六进制的哈希散列(字符串)。
/// </summary>
/// <param name="str">要加密的字符串</param>
/// <returns>加密后的十六进制的哈希散列(字符串)</returns>
public static string Sha1Signature(string str)
{
var buffer = Encoding.UTF8.GetBytes(str);
var data = SHA1.Create().ComputeHash(buffer);
StringBuilder sub = new StringBuilder();
foreach (var t in data)
{
sub.Append(t.ToString("X2"));
}
return sub.ToString();
}
方法二:比上面的写的好一点,但是这里用的默认编码
/// <summary>
/// 对字符串进行SHA1加密
/// </summary>
/// <param name="strIN">需要加密的字符串</param>
/// <returns>密文</returns>
public static string SHA1_Encrypt(string Source_String)
{
byte[] StrRes = Encoding.Default.GetBytes(Source_String);
HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
StrRes = iSHA.ComputeHash(StrRes);
StringBuilder EnText = new StringBuilder();
foreach (byte iByte in StrRes)
{
EnText.AppendFormat("{0:x2}", iByte);
}
return EnText.ToString().ToUpper();
}
方法三:加密和验证
public static string GetSha1Hash(string input)
{
byte[] inputBytes = Encoding.Default.GetBytes(input);
SHA1 sha = new SHA1CryptoServiceProvider();
byte[] result = sha.ComputeHash(inputBytes);
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < result.Length; i++)
{
sBuilder.Append(result[i].ToString("x2"));
}
return sBuilder.ToString().ToUpper();
}
public static bool VerifySha1Hash(string input, string hash)
{
string hashOfInput = GetSha1Hash(input);
StringComparer comparer = StringComparer.OrdinalIgnoreCase;
if (0 == comparer.Compare(hashOfInput, hash))
{
return true;
}
else
{
return false;
}
}
方法四:
/// <summary>
/// SHA1加密
/// </summary>
/// <param name="content">待加密的字符串</param>
/// <param name="encode">编码方式</param>
/// <returns></returns>
public static String Sha1Sign(String content,Encoding encode)
{
try
{
SHA1 sha1 = new SHA1CryptoServiceProvider();//创建SHA1对象
byte[] bytes_in = encode.GetBytes(content);//将待加密字符串转为byte类型
byte[] bytes_out = sha1.ComputeHash(bytes_in);//Hash运算
sha1.Dispose();//释放当前实例使用的所有资源
String result = BitConverter.ToString(bytes_out);//将运算结果转为string类型
result = result.Replace("-", "").ToUpper();
return result;
}catch(Exception ex)
{
return ex.Message;
}
}
运行结果:
使用工具也只是大小写差别:
ps:一定要注意在原串中如果多了一个空格,都会得到不一样的结果。