对旧的用户密码系统的改造

旧的系统密码存储的是md5(password),理论上md5在有限的时间空间内是不可逆的(实际上已经有人可以了)
一般使用md5(password),加加密后的密码进行保存
但这会有一个比较严重的问题,比如密码是123456的用户,存储的密码值都是e10adc3949ba59abbe56e057f20f883e
这样就会导致,如果被暴库后,可以拿已知的字典表来直接匹配了(所有e10adc3949ba59abbe56e057f20f883e的用户密码都是123456,这不是废话么)

一般的处理方式是加盐(salt),也就是md5(相对不变的内容+密码),这样即使密码一样,存储的内容也不一样,“相对不变的内容”一般会是用户名
这样的话,存储的是md5(userName+password)
这样就会好很多了,但是如果你的系统以前使用的md5(password),那么,你本身并没有存储password,要升级到这个方案,基本是不可行的。

md5(userName+md5(password)),这样的方案就优雅些了,也加了盐,也可以从原有的系统进行平滑升级

贴一点代码吧,

Java代码
  1. package info.frady;   
  2.   
  3. import org.apache.commons.codec.digest.DigestUtils;   
  4. public class CommonTest {   
  5.   
  6.     public static void main(String[] args) {   
  7.         String userName="frady";   
  8.         String password="123456";   
  9.         System.out.println(DigestUtils.shaHex(password));//sha(password),很少这么干   
  10.         System.out.println(DigestUtils.md5Hex(password));//md5(password),通用的做法   
  11.         System.out.println(DigestUtils.md5Hex(userName+password));//md5(userName+password),加强的做法,加了用户名做salt   
  12.         System.out.println(DigestUtils.md5Hex(userName+DigestUtils.md5Hex(password)));//md5(userName+md5(password)),兼容旧md5(password)升级的安全做法,用用户名做salt   
  13.     }   
  14. }  
posted @ 2013-06-08 12:21  最初的天堂  阅读(584)  评论(0编辑  收藏  举报