主要为了防止黑客利用用户常用密码库进行碰撞,加盐后黑客就无法通过此方法碰撞。

参考自

为什么要用哈希函数来加密密码

如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,象下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码

解决的办法是将密码加密后再存储进数据库,比较常用的加密方法是使用哈希函数(Hash Function)。哈希函数的具体定义,大家可以在网上或者相关书籍中查阅到,简单地说,它的特性如下:

  1. 原始密码经哈希函数计算后得到一个哈希值
  2. 改变原始密码,哈希函数计算出的哈希值也会相应改变
  3. 同样的密码,哈希值也是相同的
  4. 哈希函数是单向、不可逆的。也就是说从哈希值,你无法推算出原始的密码是多少

有了哈希函数,我们就可以将密码的哈希值存储进数据库。用户登录网站的时候,我们可以检验用户输入密码的哈希值是否与数据库中的哈希值相同。

由于哈希函数是不可逆的,即使有人打开了数据库,也无法看到用户的密码是多少。

那么存储经过哈希函数加密后的密码是否就是安全的了呢?我们先来看一下几种常见的破解密码的方法。

几种常见的破解密码的方法

最简单、常见的破解方式当属字典破解(Dictionary Attack)和暴力破解(Brute Force Attack)方式。这两种方法说白了就是猜密码。

字典破解和暴力破解都是效率比较低的破解方式。如果你知道了数据库中密码的哈希值,你就可以采用一种更高效的破解方式,查表法(Lookup Tables)。还有一些方法,比如逆向查表法(Reverse Lookup Tables)、彩虹表(Rainbow Tables)等,都和查表法大同小异。现在我们来看一下查表法的原理。

查表法

查表法不像字典破解和暴力破解那样猜密码,它首先将一些比较常用的密码的哈希值算好,然后建立一张表,当然密码越多,这张表就越大。当你知道某个密码的哈希值时,你只需要在你建立好的表中查找该哈希值,如果找到了,你就知道对应的密码了。

为密码加盐(Salt)

从上面的查表法可以看出,即便是将原始密码加密后的哈希值存储在数据库中依然是不够安全的。那么有什么好的办法来解决这个问题呢?答案是加盐。

盐(Salt)是什么?就是一个随机生成的字符串。我们将盐与原始密码连接(concat)在一起(放在前面或后面都可以,对于密码可以这样弄,其他情况就不行,可以看看文章下面),然后将concat后的字符串加密。采用这种方式加密密码,查表法就不灵了(因为盐是随机生成的)。

直接加盐会有缺陷性,选用Hmac

为了防止黑客通过彩虹表根据哈希值反推原始口令,在计算哈希的时候,不能仅针对原始输入计算,需要增加一个salt来使得相同的输入也能得到不同的哈希,这样,大大增加了黑客破解的难度。

如果salt是我们自己随机生成的,通常我们计算MD5时采用md5(message + salt)。但实际上,把salt看做一个“口令”,加salt的哈希就是:计算一段message的哈希时,根据不通口令计算出不同的哈希。要验证哈希值,必须同时提供正确的口令。但是随便加盐会有很多问题,就是如果采用md5(salt+message),这种方式会遇到哈希长度扩展攻击

这实际上就是Hmac算法:Keyed-Hashing for Message Authentication。它通过一个标准算法,在计算哈希的过程中,把key混入计算过程中。

和我们自定义的加salt算法不同,Hmac算法针对所有哈希算法都通用,无论是MD5还是SHA-1。采用Hmac替代我们自己的salt算法,可以使程序算法更标准化,也更安全。

Python自带的hmac模块实现了标准的Hmac算法。我们来看看如何使用hmac实现带key的哈希。

>>> import hmac
>>> message = b'Hello, world!'
>>> key = b'secret'
>>> h = hmac.new(key, message, digestmod='MD5')
>>> # 如果消息很长,可以多次调用h.update(msg)
>>> h.hexdigest()
'fa4ee7d173f2d97ee79022d1a7355bcf'

如何加盐才是正确的姿势

  1. MD5(MD5(password)+salt)
  2. SHA512(SHA512(password)+salt)
  3. 引入慢哈希: bcrypt(SHA512(password), salt, cost)

很好很好的资料

https://blog.coderzh.com/2016/01/10/a-password-security-design-example/
https://blog.coderzh.com/2016/01/03/security-design/

哈希加盐作为密钥的意义相关推荐

  1. 加盐密码哈希:如何正确使用 (密码加密的经典文章)

    https://crackstation.net/hashing-security.htm http://blog.jobbole.com/61872/ 本文由 伯乐在线 - 蒋生武 翻译.未经许可, ...

  2. 加盐密码哈希:如何正确使用 (转)

    转自http://blog.jobbole.com/61872/#java 转自http://blog.csdn.net/coslay/article/details/50382252#t14 如果你 ...

  3. 加盐哈希-Salted Password Hashing

    (译文:http://blog.jobbole.com/61872/ (中文) 原文:https://crackstation.net/hashing-security.htm (英文) 个人推荐英文 ...

  4. 加盐密码哈希:如何正确使用

    如果你是Web开发者,你很可能需要开发一个用户账户系统.这个系统最重要的方面,就是怎样保护用户的密码.存放帐号的数据库经常成为入侵的目标,所以你必须做点什么来保护密码,以防网站被攻破时发生危险.最好的 ...

  5. 密码加密 加盐 Java PBKDF2 密码哈希代码

    如果你是Web开发者,你很可能需要开发一个用户账户系统.这个系统最重要的方面,就是怎样保护用户的密码.存放帐号的数据库经常成为入侵的目标,所以你必须做点什么来保护密码,以防网站被攻破时发生危险.最好的 ...

  6. 加盐密码哈希,如何正确使用

    加盐密码哈希:如何正确使用 2014/03/19 | 分类: IT技术 | 6 条评论 | 标签: 哈希, 安全, 密码 分享到: 110 本文由 伯乐在线 - 蒋生武 翻译自 Crackstatio ...

  7. 一个简单的方式搞定密码的加盐哈希与验证

    过去一段时间来, 众多的网站遭遇用户密码数据库泄露事件.层出不穷的类似事件对用户会造成巨大的影响,因为人们往往习惯在不同网站使用相同的密码,一家 "暴库",全部遭殃. 单向加密 一 ...

  8. sha256加密_python中使用加盐哈希函数加密密码

    开发网站离不开用户的注册与登录,今天来说说在网站开发的时候关于用户密码的保存方式,传统的方式有以下几种 - 明文存储:肉眼就可以识别,没有任何安全性. 谁用谁傻缺 - 加密存储:通过一定的变换形式,使 ...

  9. 密码加密:哈希(hash)加盐

    密码落地要加密 可以采用md5进行加密 数据泄露后md5数据容易暴力破解 可以对密码进行加盐(系统给用户密码拼接上其他字符串)增加破解难度 对每个账号添加不同的盐,能够提高安全性 每个账号的盐不同,则 ...

最新文章

  1. Angular 默认的Change detection策略及缺陷
  2. 小程序input实现数据双向绑定
  3. 计算机上网英语词汇,计算机网络专用英语词汇1500词
  4. NP问题验证机的理解
  5. function signature是什么
  6. 如何成为一个网红照骗?一个插件搞定,亲妈都认不出!
  7. 3d模型多怎么优化_近似模型之响应面建模
  8. WPF 点击按钮打开新窗口
  9. 0xc0000005 系统应用日志_异常代码: 0xc0000005
  10. 二十七、商城 - 搜索解决方案-Solr(15)【1】
  11. 亚马逊商品详情API接口(item_get-获得AMAZON商品详情接口),亚马逊API接口
  12. jp.ne.so_net.ga2.no_ji.jcom.JComException: createInstance() failed HRESULT=0x800401F3L
  13. c#中regex的命名空间_C# Regex类用法
  14. [Unity绳子插件]Obi - Advanced Rope Simulation的使用
  15. 甘特图:项目进度管理中的跟踪工具
  16. 基本触发器和钟控触发器
  17. 杰理之AD140 开发板芯片没 trim 过【篇】
  18. 华为鸿蒙系统应用开发工具介绍 DevEco Studio
  19. es中should查询使用注意
  20. esp8266烧录Html文件

热门文章

  1. 学雷锋志愿魂·手抄报见行动
  2. 彻底理解粘性定位(position:sticky)
  3. redis数据库数据类型 重点数据类型特点及操作
  4. 【解决方案】公安网内网如何通过国标GB28181协议将视频流对接至公众号进行直播?
  5. 最新爆料!12个最佳开源应用获奖得主花落谁家
  6. 别光顾着学技术,也要抬头看看路
  7. SignalR 实时通讯
  8. mac电脑更改鼠标大小
  9. CSS布局设置如何才能做到左边滑动右边不动,右边滑动左边不动
  10. Bartlett球形检验