牛骨文教育服务平台(让学习变的简单)
博文笔记

MD5加盐

创建时间:2017-04-13 投稿人: 浏览次数:1337

一、使用MD5加密

现价段,登录Web系统(各种管理系统,各种论坛,各种博客等等)时通常都采用用户名和密码的形式,如果密码以明码的方式放在数据库中的话无疑会给别有用心的人以可趁之机,所以采取一定的防范措施是必要的。

现在比较安全的方式是用MD5进行加密,利用Apache commons的DigestUtils工具类我们可以迅速做到这一点。

 String password = DigestUtils.md5Hex("123456789");
        System.out.println(password);
输出

25f9e794323b453885f5181f1b624d0b
使用MD5存在一个问题,相同的password生产的Hash值是相同的,如果两个用户设置了相同的密码,那么数据库当就会存储相同的值,这样是极不安全的

二、彩虹表

简单说,彩虹表是一个字符串与其哈希值对应的表,我们可以根据哈希值 得到密码明文

关于彩虹表的详细信息请参照  彩虹表的原理简介  彩虹表完全参考手册

现阶段,随着计算机运算能力的提高与分布式系统的出现,彩虹表查找变得十分容易

但是,所有这些彩虹表都有其特定适用的密码长度和字母组合。

太长的密码(如数十位),或者包含表中没有的字符,那么用彩虹表就无法破解。

三、加盐(salt)

加Salt可以一定程度上解决这一问题。所谓加Salt方法,就是加点“佐料”。其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确。

通过加盐,生产的字符串变得更长,破解也变得更困难。

Student stu1 = new Student("lucy","123456789","asa.qq.com" );
        String password1 = DigestUtils.md5Hex(stu1.name+stu1.password+stu1.email);
        System.out.println(password1);
上面的例子中,当用户注册时,我们把用户名、密码、邮件联合起来,三个特征都相同的用户是不存在的,而且彩虹表一般不包括这么长的字符串对应的Hash值,所有一定程度上,增强了系统的安全性。

而且我么可以反复加盐,例如

Student stu1 = new Student("lucy","123456789","asa.qq.com" );
        String password1 = DigestUtils.md5Hex(stu1.name+stu1.password+stu1.email);
        DigestUtils.md5Hex(DigestUtils.md5Hex("774"+password1+"@@__"));
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。