密码的存储

先上结论:目前业界较为推荐的做法是使用PBKDF2、BCrypt或SCrypt等算法进行密码加密存储。

安全性一般都系统的做法:md5(pwd + salt); salt是盐值随机字符串;

user_name password salt
xiaoli DFEASDFASKDFJKJKLASJFKLJKLASDFAS Alsjdkfljsakljgl%^^@
xiaowang DASDFSADFASDFASDFSADFASDFASDFSA 2$%$%^kasjdfjl
  1. 黑客拿到数据库后,要想推断出来密码的原文,可以通过“彩虹表”的方式;
  2. 如何进一步防止“彩虹表”,就是 MD5(MD5(MD5(pw + salt))),多嵌套几层MD5;但是依然无法避免彩虹表的问题;

彩虹表的问题

彩虹表,为什么叫彩虹呢,就是五颜六色,颜色丰富;就是说 一张庞大的 明文 <---> md5值 映射表

由于现在都是云计算,大数据时代了,各种 分布式MySQL 层出不穷,还有很多nosql 大数据软件,** 再加上md5计算速度较快**,黑客很轻轻易就可以建立一张彩虹表;

举例:我是黑客,然后写个死循环,放到云计算环境中,一直在运行跑着,把数据 存进 阿里云的 分布式 自动拆分 PolarDB 分布式版 里,一直让程序跑下去,然后随着时间的推移,就建立一张 庞大的映射表,即彩虹表;很轻易就可以 根据 上面的pwd的 md5值 查询出他的明文;

如何防止 彩虹表呢,就是只需降低算法的执行效率就可以了,就是说 原来 MD5(dddd)耗时 1毫秒,这样我写个死循环,能在1秒内得到1000条数据,一天就可以得到1000 * 60 * 60 * 24 = 86400000 8640万条数据,由于现在CPU 计算能力都非常强,非常方便快速的建立彩虹表;那假如 md5 算法的运行效率变成 1秒一个呢,那一天就只能8万条数据,一年也就 3000万条数据,10年才能达到3亿条数据,显然黑客是需要很长的时间,才能建立庞大的彩虹表的,需要付出时间、金钱才能建立庞大的彩虹表;故这样就防止了彩虹表;这样的算法 就是下文提到的:PBKDF2、BCrypt或SCrypt算法


将用户密码以密文形式存储进数据库是保护用户信息安全的重要措施。以下是一些常见的密码加密存储方案:

  1. 哈希加密

    • 使用哈希函数(如SHA-256, SHA-1, MD5等)将密码转换为固定长度的哈希值。
    • SHA-256是目前较为安全的哈希算法,它生成的哈希值长度为64个字符,极大地提高了安全性。
    • 需要注意的是,哈希是单向的,无法从哈希值还原出原始密码。
    • 为了增强安全性,可以在哈希前给密码“加盐”,即添加一段随机字符串,再对加盐后的密码进行哈希。
  2. PBKDF2、BCrypt或SCrypt算法

    • 这些算法是目前公认比较安全的密码存储方式。
    • 它们都使用了一个计算强度因子,使得密码摘要的计算变得更为困难和耗时,从而增加了暴力破解的难度。
    • 这些算法在设计上考虑了对抗彩虹表等攻击手段。
  3. 对称加密

    • 使用相同的密钥进行加密和解密,如AES、DES等算法。
    • 对称加密速度较快,但密钥管理较为复杂,且如果密钥泄露,则整个加密体系将被攻破。
  4. 非对称加密

    • 使用公钥和私钥进行加密和解密,如RSA算法。
    • 非对称加密安全性较高,但加密和解密速度相对较慢。
  5. 数据库字段级加密

    • 可以使用MySQL提供的加密函数(如AES_ENCRYPT)对敏感数据进行加密。
    • 这种方法允许在数据库中直接存储加密后的数据,并在需要时通过相应的解密函数进行解密。

推荐做法

  • 目前业界较为推荐的做法是使用PBKDF2、BCrypt或SCrypt等算法进行密码加密存储。
  • 这些算法通过增加计算强度来提高安全性,使得暴力破解变得非常困难。
  • 同时,这些算法也有效对抗了彩虹表等攻击手段。

在实施密码加密存储时,还应注意以下几点:

  • 确保加密密钥的安全存储和传输。
  • 定期更新和审查加密策略以应对新的安全威胁。
  • 避免使用已经被认为不安全的加密算法(如MD5、SHA-1等)。
  • 在可能的情况下,启用数据库的安全配置和访问控制来进一步保护存储的密文密码。

手机号、身份证号等敏感信息的存储

这些信息,可以 AES对称加密算法,存进MySQL里;用同一个秘钥就可以了,没有必要多个秘钥;现在很多开放平台也是这么搞的;

posted on 2024-06-23 09:42  del88  阅读(1)  评论(0编辑  收藏  举报