在 C# 使用哈希算法加密数据

什么是哈希算法

哈希算法是一种将任意长度的明文映射为较短的密文的一种加密算法,其特点主要有以下几点。

  • 单向不可逆,将明文映射密文非常简单,但将密文还原为原始明文则非常困难
  • 变化敏感性,即明文任意小的变动都能引起密文的显著变化
  • 冲突极小化,即要认为构造两个相同的明文,使他们的哈希值一样,是非常困难的

正是因为哈希算法这种类似指纹的特点,其主要用于验证密码、检查内容的完整性和真实性等方面。比如,考虑到安全因素,用户的密码不宜用明文存储,这时就可以用哈希算法计算其哈希值存储。

另外,下载重要文件时,为了检验文件的完整性和真实性,下载方通常会给出改文件的校验值值,实际上也是一种哈希值。

正确使用哈希算法

.NET 支持主流的哈希算法,包括:MD5、SHA1、SHA256 、SHA384、SHA512,其加密强度依次递增、运算小号依次递减。目前 MD5SHA1 已经不够安全,建议是至少使用 SHA256,敏感数据使用 SHA512

为了防范字典攻击,在密码加密实践中,通常会再添加一段随机字符串,与用户提供密码混入后提供给哈希算法加密,即所谓的基于哈希算法的消息认证码(HMAC,Hash-based Message Authentication Code)。在 C# 中,通过以下方式使用。

 var keyBytes = Encoding.UTF8.GetBytes("随机字符串");
 var passwordBytes = Encoding.UTF8.GetBytes("用户密码");
 
 // MD5 算法
 byte[] md5 = HMACMD5.HashData(keyBytes, passwordBytes);
 
 // SHA1 算法
 byte[] sha1= HMACSHA1.HashData(keyBytes, passwordBytes);
 
 // SHA256 算法
 byte[] sha256 = HMACSHA256.HashData(keyBytes, passwordBytes);
 
 // SHA384 算法 
 byte[] sha384 = HMACSHA384.HashData(keyBytes, passwordBytes);
 
 // SHA512 算法
 byte[] sha512 = HMACSHA512.HashData(keyBytes, passwordBytes);
  

如果需要将加密后的字节数据转化为字符串,可以用 Base64 转换。

 static string HMACSHA512Text(string password, string key)
 {
     var keyBytes = Encoding.UTF8.GetBytes(key);
     var passwordBytes = Encoding.UTF8.GetBytes(password);
     var hashBytes = HMACSHA512.HashData(keyBytes, passwordBytes);
     return Convert.ToBase64String(hashBytes);
 }


总之,安全无小事,敏感数据千万不能明文存储,且在进行签名时一定要混入额外数据,密码学中称之为加盐(Salt)来进一步提高安全性。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章