哈希算法是一种将任意长度的明文映射为较短的密文的一种加密算法,其特点主要有以下几点。
正是因为哈希算法这种类似指纹的特点,其主要用于验证密码、检查内容的完整性和真实性等方面。比如,考虑到安全因素,用户的密码不宜用明文存储,这时就可以用哈希算法计算其哈希值存储。
另外,下载重要文件时,为了检验文件的完整性和真实性,下载方通常会给出改文件的校验值值,实际上也是一种哈希值。
.NET 支持主流的哈希算法,包括:MD5、SHA1、SHA256 、SHA384、SHA512,其加密强度依次递增、运算小号依次递减。目前 MD5 和 SHA1 已经不够安全,建议是至少使用 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 条评论) “” |