密码学基本原理

  • 现代密码学的安全基础是密钥的保密性,而不是像古典密码学那样基于算法的保密性

md5

  • md5全称为消息摘要算法版本5 (Message Digest Algorithm 5),是一种hash算法
  • md5就是把不论什么长度的文字内容,给精简成128位散列数
    • 一个MD5值对应着无穷多的原始值,这是个天然缺陷
  • 现在对md5算法的破解,实质就是查彩虹表
    • 事先存好很多常用密码的md5值,然后反查,得到对应的原文
    • 暴力破解本来不算是可破解的,但是,如果直接利用用户输入的字符进行MD5,就不一样了。用户的可能输入字符组合相对于随机的字符组合来说非常集中,也就是信息熵其实很低:比如,有一些密码组合会被很多人使用,例如123456,password等
  • 在加密领域,DES和RSA才是真正的加密,而MD5更多的用在文档校验上,用来生成密钥检测文档是否被篡改
  • 常用的哈希函数中,SHA-256、SHA-512 会比 md5 更安全,更难破解

加盐

  • 为了保护用户密码,早期人们使用MD5算法把密码加密后保存,通常计算MD5值时会加一个”盐值“(即一个固定的密串),这个盐值可能是共用的(固定盐),也可能是一个用户一个盐值(随机盐)
  • 数据库存上salt和hash,每当用户注册,随机生成salt,hash = md5(password + salt)
    • 登录的时候验证md5(input + salt)和hash是否相等即可
  • 盐值甚至可以是公开的
    • 哈希算法本来就是不可逆的,加盐只是为了防止彩虹表攻击
    • 比如我的盐是nizhendehaoshuaia的一串随机字符。这种情况下,彩虹表就没用了
    • 因为彩虹表就是提前计算的,那我要算你这个彩虹表,我就得 md5(nizhendehaoshuaia + 注册密码的所有可能"),把这个整个东西算出来先。
    • 然而攻击者不可能对每个盐都算一遍彩虹表,这种就根本不划算
  • 盐最好每个账号都不一样
    • 如果你的盐只有一个,那么他只要算一次,就能反查你所有的账号
  • 加盐能保证你不直接受彩虹表的反查攻击,但人家要强行爆破一条密码,还是可以的
    • 比如我就要爆破 md5(helloword + nizhendehaoshuaia)这条,那直接暴力穷举即可
    • 所以需要那些计算得很慢的哈希函数,那这样别人穷举计算要花很长时间以至于放弃
      • 例如SHA-256SHA-512等hash函数,所以他们比md5更加安全
  • 为了进一步防止字典攻击,可以在应用服务器加一个pepper
    • 加一个pepper就是,在应用服务器上有一串随机字符串,然后哈希前加在密码和盐后面
发布了161 篇原创文章 · 获赞 19 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/winter_wu_1998/article/details/103791206