有趣的密码加密策略,你知道自己的密码如何在网站中存储的吗?

原创
2015/03/29 21:57
阅读数 6.9K

哈希加密的概况

    早期也就是很早的时候,系统里可能直接存的就是用户的明文密码,密码是什么就存什么,然后每次校验直接匹配就好了.后来人们开始使用哈希进行加密,得到现在的普遍使用的密文.

    最简单的基于密文的密码存储策略(通常可能是MD5加密方式)就是我下面画的图:

  • 哈希算法是一个单向的函数,将任意大小的数据转换成统一长度的密文,并且无法被反向计算.并且每个不同数据通过哈希函数转换成的结果都是不同的.

  • 程序中真正比对的是密文哈希值,只有相同才被授权.不相同也不要告知到底是用户名错误还是密码错误,给出一个模糊的提示就行,防攻击者在不知道密码的情况下,遍历出可用的用户名.

  • 不是所有的哈希函数都是安全的,适用于加密的.有些哈希函数是用于哈希表这类数据结构,方便快速查找的.适用于加密的有类似于:SHA256,SHA512,RipeMD之类的哈希函数.

  • 最后要说明,单纯的哈希加密太容易破解了,从目前的状况看它并不安全.


为何说单纯的哈希加密并不安全?

    之所以说单纯的哈希加密并不安全因为破解的方式有很多,鉴于现在计算机性能(CPU发展已经到了一个瓶颈,现在普通的笔记本性能几乎就是20年前的超级计算机)的提升以及黑客技术的进步,很多网站都提供了破解哈希的功能.下面列举出一些常用的破解方式:

  • 暴力破解(这是不可阻止的破解方式之一,在给定长度的情况下尝试各种字符的组合,虽然效率非常低,但通过遍历最终一定会得到密码,相当于把所有的可能都尝试一遍)

  • 字典攻击(同样是不可阻止的破解方式之一,相当于暴力破解的升级版,通过收集常用的单词,词组,密码然后将所有的都存储起来,根据这些更加接近的数据进行比对,碰运气去猜)

  • 查表法(预先计算密码字典中得每个密码,然后把哈希值和对应密码存储到一个快插查询的数据结构中,以后就查询这个表就行了)

  • 彩虹表(这才是大杀器,说白了就是把一定长度的明文密码以及对应的哈希密码都存储下来,然后按照查表法的方式进行破解)


传说中让彩虹表都无力的加盐

    我们上面说到的几种破解方式都是基于一个最基本的原则,所有密码都以相同的方式进行哈希加密.也就是说如果两个账号明文密码相同,他们哈希后得到的密文也是相同的.如果我们能通过一些'小手段'让它们不同,那么破解的难度就是指数级的倍增了.

    具体的做法就是在密码中加入一段"随机化"的字符串,然后再进行哈希化.这样就将原来的同样明文映射到同样密文的规则打乱了,其中混入的'随机'字符串就是所谓的'盐'.

    这些思想都不复杂,但是在真正的工作中大多数人还是会犯下一些"错误",使我们的料加的并不好,比如:

  • "盐值"的长度太短(通常要和密文长度一样才行)或者"盐值"出现重复

  • 哈希函数进行嵌套或者组合使用(非常重要的一点,别相信自己发明的某种加密方式,使用由密码学家研究出来的标准算法)

  • 尽量避免使用已经过时或者低端的哈希函数,例如: MD5,SH1等,推荐SH256,SH512等等.

  • "盐值"的产生并不是一个随意的rand()函数,要使用基于加密的伪随机函数生成器,更加高度的随机性.

展开阅读全文
打赏
13
195 收藏
分享
加载中
支付宝不都是128的RSA么
2015/04/21 13:42
回复
举报

引用来自“___Null”的评论

引用来自“首席撸破皮”的评论

没有绝对安全。即使加盐了, 遇到笨蛋类型的客户(123456),你也无解。

引用来自“隐形人”的评论

弱口令 那完全是社会工程学的范畴了

引用来自“郭大侠”的评论

还有色诱法,那完全是生理学、心理学的范畴了。
还有靠殴打用户获取密码 哈哈哈

我忍不住笑了
2015/04/08 01:23
回复
举报
password叫口令吧,cipher才是密码。
2015/04/02 14:59
回复
举报

引用来自“首席撸破皮”的评论

没有绝对安全。即使加盐了, 遇到笨蛋类型的客户(123456),你也无解。

引用来自“首席撸出血”的评论

你是在说我么
看蒙了 还以为是自言自语
2015/03/31 11:41
回复
举报

引用来自“首席撸破皮”的评论

没有绝对安全。即使加盐了, 遇到笨蛋类型的客户(123456),你也无解。

引用来自“隐形人”的评论

弱口令 那完全是社会工程学的范畴了

引用来自“郭大侠”的评论

还有色诱法,那完全是生理学、心理学的范畴了。
还有靠殴打用户获取密码 哈哈哈
2015/03/30 21:22
回复
举报

引用来自“HandMU”的评论

“并且每个不同数据通过哈希函数转换成的结果都是不同的.”这说法是不严谨的,以无穷计算有穷必定存在冲突域。

引用来自“我不是经常来的”的评论

+1 另外lz所说的都是摘要算法,不属于加密算法。
+1 类似MD5碰撞。。。
2015/03/30 16:34
回复
举报

引用来自“首席撸破皮”的评论

没有绝对安全。即使加盐了, 遇到笨蛋类型的客户(123456),你也无解。

引用来自“隐形人”的评论

弱口令 那完全是社会工程学的范畴了
银行不是禁止了 123456 000000 888888 这样么。效果是好点了。可是压力也大了,很多人就是记不住这6个数字,那就找银行改密码。。。。。 文章说的是数据库中的混淆,防止别人下走你的数据库后提取真实密码。不过世事无绝对,盐也要放在数据库里,能下载你数据库,离你的代码也不远了~~~
2015/03/30 16:32
回复
举报
人们的安全意识越来越强了。感谢科普!
2015/03/30 16:31
回复
举报
顽Shi博主

引用来自“错觉”的评论

user表存密文和对称加密的salt 因为目前基于云的应用你的数据库和os对于提供商来说是公开的 因此加密解密salt用程序实现 这样除非有人得到代码反编译 否则没人知道salt 这样就相对安全了 因为没有绝对的安全 你比别人多做一步 那黑客攻击的就是别人
这个观点还真是现实,确实没有绝对的安全,只能提高被攻击的成本.
2015/03/30 16:24
回复
举报
这个。。大家好像都是这么干的吧,而且不单单只有sha,还有aes等加密算法怎么不提?
2015/03/30 16:22
回复
举报
更多评论
打赏
43 评论
195 收藏
13
分享
返回顶部
顶部