Java|如何安全保存用户密码及哈希算法( 二 )


加盐 Salt那么 , 由于简单的对密码进行Hash算法不够安全 , 那么我们就可以对密码加Salt , 比如密码是\"I love you\" 虽然彩虹表里有这条数据 , 但是如果加上\"安红我爱你\" , 这样MD5结果就大不一样.
jacks-MacBook-Air:~ jack$ irb2.2.3 :001 > require 'digest/md5.so'=> true2.2.3 :002 > puts Digest::MD5.hexdigest('I love you')
e4f58a805a6e1fd0f6bef58c86f9ceb3
=> nil2.2.3 :003 > puts Digest::MD5.hexdigest('I love you安红我爱你')
b10d890bf46b1a045eb99af5d43c7b13
=> nil2.2.3 :004 > puts Digest::MD5.hexdigest('I dont love you')
c82294c9a7b6e4a372ad25ed4d6011c9
=> nil2.2.3 :005 > puts Digest::MD5.hexdigest('I dont love you安红我爱你')
dce67bcdfdf007445dd4a2c2dc3d29c1
=> nil2.2.3 :006 >

如此一来 , 因为攻击者很难猜到“安红我爱你” , 那么自然彩虹表里是没有的 , 当然我建议你在实际项目中不要使用\"安红我爱你\" , 你应该使用一个连你自己都猜不到的较长的字符串 。
加盐了 , 就安全了吗?实际上 , 加盐并不能100%保证安全 , 假如有人泄露了你的Salt呢?实际上通过反编译程序很容易可以拿到这个 , 由于WEB程序一般放在WEB服务器上 , 那么就需要保证服务器不被攻击 , 当然这个是运维人员去操心 。
为了让加盐更安全 , 一般情况下我们可以使用一个“盐+盐” , 也就是为每个用户保存一个\"Salt\" ,然后再使用全局的盐 , 我们可以对用户的盐使用自己的加密算法 。 那么代码就如下:
if MD5(userInputPpassword+globalsalt+usersalt)===user.databasePassword)
{    login success


普通用户如何做?由于这个是写给程序员 , 当然是说在前端用户注册时密码应该如何设置 , 很简单 , 我们要求用户必须输入强密码!但是 , 我知道很多用户觉得很烦 , 这样你就失掉了一个用户 , 但我们需要做一个适当的折中 , 比如至少有一个大写字母 , 小写字母和数字的组合 。
最后我们来看看解决了之前文章下面例子的什么问题 。
假如 , 明明和丽丽相互不认识 , 明明想给丽丽写一封情书 , 让隔壁老王送去

  1. 如何保证隔壁老王不能看到情书内容?(保密性)
  2. 如何保证隔壁老王不修改情书的内容?(完整性)
  3. 如何保证隔壁老王不冒充明明?(身份认证)
  4. 如何保证明明不能否认情书是自己写的?(来源的不可否认)

【Java|如何安全保存用户密码及哈希算法】通过了解hash算法\"明明\" 就有办法让丽丽知道信的内容没有修改 , 他可以对邮件进行Hash生成邮件的摘要 , 然后让\"隔壁的李叔叔\"把摘要送给丽丽 , 丽丽拿到邮件的摘要后 , 把邮件内容也Hash一下 , 然后把结果和\"隔壁的李叔叔\"给的摘要对比一下 , 然后通过比较结果就知道邮件有没有被\"隔壁的王叔叔\"更改过了 。