赞
踩
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。(来源百度百科解释)
MD5 也是 Hash 算法的一种,常见的 Hash 算法还有 sha1
、sha2
等。
MD5 也被称为信息摘要算法,由于其算法复杂不够,容易被暴力破解。
sha1
算法也存在和 MD5 一样的问题。
MD5
,得到的结果都是 32 个字符长度的字符串通过它的这几个特点,我们可以谈谈 Hash 它的运用场景
我们在开发的过程中首次登陆需要向服务器发送用户密码进行账户验证,但是用户的密码是非常隐私的信息,所以一定要使用加密保护。
目前较为常见的解决方案就是使用密码的 Hash
或 md5
值进行验证。
直接将用户输入的密码进行 Hash 运算,得到结果发送给服务器验证。因为 Hash 算法无法逆运算,所以就算 Hash
值泄露,用户真实密码也不会泄露。
需要服务器配合,在用户注册的时候,服务端的数据库中保存的就是用户密码的 Hash 值,而不是密码本身(根据 Hash 的特点,对相同的数据加密结果是一样的)。这样就算服务器被攻克,用户的隐私信息也能起到一定的保护。
也就是现在为什么各类产品只提供重置密码的功能,而不再有找回密码的功能了。因为服务端本身也不知道用户的真实密码。
特别说明:用户的密码属于非常隐私的信息。因为大多数用户有一个特点。密码喜欢使用重复的。如果你的APP泄露了用户的密码。那么很有可能,黑客利用用户的手机号码加上密码,可以登录用户的其他应用软件,或者套出用户的支付信息,这种后果是非常严重的!
上面所说的案例理论上已经非常的"安全"了。因为就算黑客知道了你的 Hash 值,也没法逆运算出用户的密码。但情况并不乐观。我们眼见为实!
以 MD5
为例:比如我的密码是123456
;MD5
的结果是:e10adc3949ba59abbe56e057f20f883e
接下来隆重介绍一个网站 www.cmd5.com/
我们只需要将 Hash 值进行反向的查询。
可能你会问,Hash 既然不能反算,为何这个网站能够查询出来?仔细看下网站的介绍不难发现:其实它是一个巨大的数据库。利用明文和 Hash 的数据记录,进行反向查询。
当然,提供哈希反向查询服务的不仅仅只有这个网站,还有很多盈利性的公司提供有偿服务。
所以如果我们单纯的直接使用 Hash 算法,用户的密码安全性会非常低。
早期的解决方案:加盐
let salt = '~!@#$qwerty'
pwd = pwd + salt
再进行 Hash 或者 MD5 的加密。这种方式,对于反向查询来说就比较困难了,安全系数也相对较高。
对于简单的使用盐的方式还是会有安全隐患,因为如果盐被泄露了。那么整个项目将陷入被动。因为这种方式将盐写死在程序里面了,要想今后换掉是非常难的。
那么接下来介绍一种加密方案 HMAC。它使用一个密钥,并且做了两次散列。
注意:在开发过程中,这个密钥 KEY 是从服务器获取的。并且一个用户对应一个 KEY
对于这种加密方案,就可以很好的保护用户的隐私信息,因为就算泄露了 KEY。这个 KEY 也只是一个用户的,不会污染整个项目。
如果拿到这个 KEY,然后想反查询出用户的明文密码。也是极其困难的。
所谓安全,无法做到绝对安全。他们灰产有句话:只要钱到位,没有什么不可能!我们要做到的就是相对安全,让破解的成本大于破解的利润。
—————————— 【正文完】——————————
前端学习交流群,想进来面基的,可以加群: 832485817,685486827;
写在最后: 约定优于配置 —— 软件开发的简约原则
——————————【完】——————————
我的:
个人网站: https://neveryu.github.io/neveryu/
Github: https://github.com/Neveryu
新浪微博: https://weibo.com/Neveryu
微信: miracle421354532
更多学习资源请关注我的新浪微博…好吗
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。