手机版

使用Salt Hash加密密码 然后将其存储在数据库中

时间:2021-10-06 来源:互联网 编辑:宝哥软件园 浏览:

(1)为什么要用哈希函数加密密码?如果需要保存密码(比如网站用户的密码),就要考虑如何保护这些密码数据。将密码直接写入数据库极其不安全,因为任何能够打开数据库的人都可以直接看到这些密码。image

解决方案是加密密码,然后将其存储在数据库中。常用的加密方法是使用哈希函数。散列函数的具体定义可以在互联网上或相关书籍中找到。简单来说,它的特点是:(1)原始密码由哈希函数计算得到一个哈希值;(2)如果原始密码改变,哈希函数计算的哈希值也会相应改变;(3)相同的密码,相同的哈希值;(4)哈希函数是单向且不可逆的。也就是说,从哈希值中,你无法计算出原始密码。通过哈希函数,我们可以将密码的哈希值存储在数据库中。当用户登录网站时,我们可以检查用户输入的密码的哈希值是否与数据库中的哈希值相同。image

因为哈希函数是不可逆的,所以即使有人打开数据库,他们也看不到用户的密码。那么用哈希函数加密的密码存储安全吗?让我们来看看破解密码的几种常见方法。(2)几种常见的密码破解方法最简单也是最常见的破解方法是字典攻击和蛮力攻击。说白了,这两种方法都是猜测密码。image

字典破解和蛮力破解都是低效的破解方法。如果您知道数据库中密码的哈希值,则可以使用更有效的破解方法“查找表”。其他方法,如反向查找表和彩虹表,与查找方法类似。现在我们来看看查表的原理。查表法不像字典破解和蛮力破解那样去猜密码。它首先计算一些常用密码的哈希值,然后构建一个表。当然,密码越多,表就越大。当您知道密码的哈希值时,您只需要在您构建的表中查找哈希值。如果找到了,就会知道对应的密码。image

(3)加盐密码从上表查找方法可以看出,即使将原密码加密的哈希值存储在数据库中,仍然不够安全。那么解决这个问题的好方法是什么呢?答案是盐。盐是什么?是随机生成的字符串。我们将salt与原始密码连接起来(在它之前或之后),然后在连接之后加密字符串。如果密码以这种方式加密,表查找方法将不起作用(因为salt是随机生成的)。Picture1

(4)在中的实施。NET InNET中,RNGCryptoServiceProvider类可以用来生成salt,也可以使用GUID。哈希函数算法我们可以用SHA(Secure Hash Algorithm)家族算法,当然哈希函数算法也有很多,比如,你也可以用MD5。顺便说一句,美国政府以前广泛使用SHA-1算法,但2005年,山东大学王小云教授发现了安全漏洞,所以现在更常见的是使用SHA-1的加长变种,比如SHA-256。英寸NET中,可以使用sha 256托管类。让我们看一段代码,它演示了如何在中向密码添加盐。NET。加密的密码保存在MySQL数据库中。image

下面的代码演示如何注册一个新帐户。盐的生成可以使用新Guid,也可以使用RNGCryptoServiceProvider类。将字节[]转换为字符串,可以使用Base64String(我在以前的博客中介绍过基本64编码编码),也可以使用下面的ToHexString方法。复制代码代码如下:受保护的void ButtonRegister_Click(对象发送者,事件参数e){ 0字符串用户名=文本框用户名.文字;字符串密码=文本框密码.文字;//随机盐串salt=Guid .NewGuid().ToString();//随机盐/您也可以使用RNGCryptoServiceProvider类//系统.安全性安全。密码学。rngcryptoserviceprovider();//byte[]salt bytes=new byte[36];//rng .GetBytes(盐字节);//字符串盐=转换.tobase64字符串(盐字节);//string salt=to exstring(salt字节);字节[]密码和备用字节=系统文字。编码. UTF8.GetBytes(密码盐);字节[]具有字节=新系统。安全性。密码学。SHA256Managed().ComputeHash(passwordnandaltbytes);字符串散列字符串=转换.到base64字符串(hashBytes);//也可以使用到exstring将字节[]转换为string//string hashString=to ex string(hashBytes);var db=new TestEntities();用户凭据新记录=用户凭据.Createusercredential(username,hashString,salt);db。用户凭据。AddObject(new record);db .saveChanges();} string到ex string(byte[]bytes){ var hex=new StringBuilder();foreach(字节中的字节b){ hex .AppendFormat('{0:x2} ',b);}返回十六进制. ToString();}下面的代码演示了如何检验登录用户的密码是否正确。首先检验用户名是否存在,如果存在,获得该用户的盐,然后用该盐和用户输入的密码来计算哈希值,并和数据库中的哈希值进行比较。复制代码代码如下:受保护的作废按钮登录_点击(对象发送者,事件参数e){ 0字符串用户名=文本框用户名.文字;字符串密码=文本框密码.文字;var db=new TestEntities();用户凭据记录=数据库。用户凭据。其中(x=字符串.比较(x.UserName,UserName,true)=0).first ordefault();if(record==default(用户凭据)){ 0引发新的应用程序异常(“”无效的用户名和密码');}字符串盐=记录.盐;字节[]密码和备用字节=系统文字。编码. UTF8.GetBytes(密码盐);字节[]具有字节=新系统。安全性。密码学。SHA256Managed().ComputeHash(passwordnandaltbytes);字符串散列字符串=转换.到base64字符串(hashBytes);if (hashString==record .passwordshash){//用户登录成功} else {抛出新的应用程序异常(“”用户名和密码无效');} }总结:单单使用哈希函数来为密码加密是不够的,需要为密码加盐来提高安全性,盐的长度不能过短,并且盐的产生应该是随机的。

版权声明:使用Salt Hash加密密码 然后将其存储在数据库中是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。