早期也就是很早的时候,系统里可能直接存的就是用户的明文密码,密码是什么就存什么,而后每次校验直接匹配就行了.后来人们开始使用哈希进行加密,获得如今的广泛使用的密文.算法
最简单的基于密文的密码存储策略(一般多是MD5加密方式)就是我下面画的图:安全
哈希算法是一个单向的函数,将任意大小的数据转换成统一长度的密文,而且没法被反向计算.而且每一个不一样数据经过哈希函数转换成的结果都是不一样的.数据结构
程序中真正比对的是密文哈希值,只有相同才被受权.不相同也不要告知究竟是用户名错误仍是密码错误,给出一个模糊的提示就行,防攻击者在不知道密码的状况下,遍历出可用的用户名.函数
不是全部的哈希函数都是安全的,适用于加密的.有些哈希函数是用于哈希表这类数据结构,方便快速查找的.适用于加密的有相似于:SHA256,SHA512,RipeMD之类的哈希函数.性能
最后要说明,单纯的哈希加密太容易破解了,从目前的情况看它并不安全.网站
之因此说单纯的哈希加密并不安全由于破解的方式有不少,鉴于如今计算机性能(CPU发展已经到了一个瓶颈,如今普通的笔记本性能几乎就是20年前的超级计算机)的提高以及黑客技术的进步,不少网站都提供了破解哈希的功能.下面列举出一些经常使用的破解方式:
加密
暴力破解(这是不可阻止的破解方式之一,在给定长度的状况下尝试各类字符的组合,虽然效率很是低,但经过遍历最终必定会获得密码,至关于把全部的可能都尝试一遍)spa
字典攻击(一样是不可阻止的破解方式之一,至关于暴力破解的升级版,经过收集经常使用的单词,词组,密码而后将全部的都存储起来,根据这些更加接近的数据进行比对,碰运气去猜)ip
查表法(预先计算密码字典中得每一个密码,而后把哈希值和对应密码存储到一个快插查询的数据结构中,之后就查询这个表就好了)字符串
彩虹表(这才是大杀器,说白了就是把必定长度的明文密码以及对应的哈希密码都存储下来,而后按照查表法的方式进行破解)
咱们上面说到的几种破解方式都是基于一个最基本的原则,全部密码都以相同的方式进行哈希加密.也就是说若是两个帐号明文密码相同,他们哈希后获得的密文也是相同的.若是咱们能经过一些'小手段'让它们不一样,那么破解的难度就是指数级的倍增了.
具体的作法就是在密码中加入一段"随机化"的字符串,而后再进行哈希化.这样就将原来的一样明文映射到一样密文的规则打乱了,其中混入的'随机'字符串就是所谓的'盐'.
这些思想都不复杂,可是在真正的工做中大多数人仍是会犯下一些"错误",使咱们的料加的并很差,好比:
"盐值"的长度过短(一般要和密文长度同样才行)或者"盐值"出现重复
哈希函数进行嵌套或者组合使用(很是重要的一点,别相信本身发明的某种加密方式,使用由密码学家研究出来的标准算法)
尽可能避免使用已通过时或者低端的哈希函数,例如: MD5,SH1等,推荐SH256,SH512等等.
"盐值"的产生并非一个随意的rand()函数,要使用基于加密的伪随机函数生成器,更加高度的随机性.