所谓加Salt,就是加点“佐料”。当用户首次提供密码时(一般是注册时),由系统自动往这个密码里加一些“Salt值”,这个值是由系统随机生成的,而且只有系统知道。而后再散列。而当用户登陆时,系统为用户提供的代码撒上一样的“Salt值”,而后散列,再比较散列值,已肯定密码是否正确。
这样,即使两个用户使用了同一个密码,因为系统为它们生成的salt值不一样,他们的散列值也是不一样的。即使黑客能够经过本身的密码和本身生成的散列值来找具备特定密码的用户,但这个概率过小了(密码和salt值都得和黑客使用的同样才行)。html
假设你的数据库已经被黑客拿到了。 好比 md5sum("123456") = "e10adc3949ba59abbe56e057f20f883e" 若是不用 salt ,直接 md5 的话,直接在你的数据库里搜索后面那个值不就能找出全部密码是"123456"的用户了吗? 要知道,黑客的目的其实并非(或者说大多数时候不是)破解某一我的的密码,而是获取大量的用户名/密码对。 好了,如今你加了盐,但盐是固定的,好比直接写死在代码里的,这样行不行呢?这样也是不行的,由于黑客仍然能够经过预先计算的方式来作。好比黑客黑了你的服务器,看到了你的代码,知道了你的盐是 xxx ,因而他计算: md5sum("123456xxx") = "e087dae60e744ea80722b785a75adbb7" 而后再到你的数据库里搜索,又能获得大量密码是 123456 的用户了。 那该怎么办呢? 因此,不但要加盐,并且每一个用户的盐还得不同。我看到的一种作法是,直接用每一个用户的用户名,或者用户名的变形来作盐。 数据库
Token,就是令牌,最大的特色就是随机性,不可预测。通常黑客或软件没法猜想出来。安全
那么,Token有什么做用?又是什么原理呢?服务器
Token通常用在两个地方:cookie
1)防止表单重复提交、session
2)anti csrf攻击(跨站点请求伪造)。xss
二者在原理上都是经过session token来实现的。当客户端请求页面时,服务器会生成一个随机数Token,而且将Token放置到session当中,而后将Token发给客户端(通常经过构造hidden表单)。下次客户端提交请求时,Token会随着表单一块儿提交到服务器端。
而后,若是应用于“anti csrf攻击”,则服务器端会对Token值进行验证,判断是否和session中的Token值相等,若相等,则能够证实请求有效,不是伪造的。
不过,若是应用于“防止表单重复提交”,服务器端第一次验证相同事后,会将session中的Token值更新下,若用户重复提交,第二次的验证判断将失败,由于用户提交的表单中的Token没变,但服务器端session中Token已经改变了。post
上面的session应用相对安全,但也叫繁琐,同时当多页面多请求时,必须采用多Token同时生成的方法,这样占用更多资源,执行效率会下降。所以,也可用cookie存储验证信息的方法来代替session Token。好比,应对“重复提交”时,当第一次提交后便把已经提交的信息写到cookie中,当第二次提交时,因为cookie已经有提交记录,所以第二次提交会失败。
不过,cookie存储有个致命弱点,若是cookie被劫持(xss攻击很容易获得用户cookie),那么又一次gameover。黑客将直接实现csrf攻击。加密
因此,安全和高效相对的。具体问题具体对待吧。url