Shiro安全框架学习(三) —— shiro加密处理

本文介绍了Shiro安全框架中如何使用MD5加密处理用户密码,强调了非对称加密的重要性。同时,文章讨论了MD5加密的局限性,如相同的明文密码会得到相同的加密结果,容易被穷举或预计算攻击。为解决这一问题,引入了盐的概念,通过加盐和多次加密提高安全性。文中还详细说明了如何在数据库、DAO、DatabaseRealm以及shiro.ini配置文件中实现加盐MD5加密策略,并探讨了另一种利用Shiro的HashedCredentialsMatcher进行密码验证的方法。
摘要由CSDN通过智能技术生成

md5 加密

 在前面的例子里,用户密码是明文的,这样是有巨大风险的,一旦泄露,就不好了。
所以,通常都会采用非对称加密,什么是非对称呢?就是不可逆的,而 md5 就是这样一个算法。
如代码所示 123 用 md5 加密后,得到字符串: 202CB962AC59075B964B07152D234B70
这个字符串,却无法通过计算,反过来不会得到源密码是 123。
这个加密后的字符串就存在数据库里了,下次用户再登陆,输入密码 123, 同样用md5 加密后,再和这个字符串一比较,就知道密码是否正确了。
如此这样,既能保证用户密码校验的功能,又能保证不暴露密码。


MD5加密代码(法一), java.security.MessageDigest:

package com.ares_bms.util;

import java.security.MessageDigest;

public class Md5Util {

    public static String MD5(String key) {
        char hexDigits[] = {
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
        };
        try {
            byte[] btInput = key.getBytes();
            // 获得MD5摘要算法的 MessageDigest 对象
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            // 使用指定的字节更新摘要
            mdInst.update(btInput);
            // 获得密文
            byte[] md = mdInst.digest();
            // 把密文转换成十六进制的字符串形式
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            return null;
        }
    }
    
    public static void main(String[] args) {
    	System.out.println(Md5Util.MD5("666"));
	}
}

 MD5加密代码(法二),org.apache.shiro.crypto.hash.Md5Hash:

package com.how2java;

import org.apache.shiro.crypto.hash.Md5Hash;

public class TestEncryption {

    public static void main(String[] args) {
        String password = "123";
        String encodedPassword = new Md5Hash(password).toString();

        System.out.println(encodedPassword);
    }
}

 盐

上面讲了md5加密,但是md5加密又有一些缺陷:

  1. 如果我的密码是 123,你的也是 123,,那么md5的值是一样的,那么通过比较加密后的字符串,我就可以反推过来,原来你的密码也是123。
  2. 与上述相同,虽然 md5 不可逆,但是我可以穷举法呀,我把特别常用的100万或者更多个密码的 md5 值记录下来,比如12345的,abcde的。 相当一部分人用的密码也是这些,那么只要到数据库里一找,也很快就可以知道原密码是多少了。这样看上去也就破解了,至少一部分没有想象中那么安全吧。

为了解决这个问题,引入了盐的概念。 盐是什么意思呢? 比如炒菜,直接使用md5,就是对食材(源密码)进行炒菜,因为食材是一样的,所以炒出来的味道都一样,可是如果加了不同分量的盐,那么即便食材一样,炒出来的味道也就不一样了。

所以,虽然每次 123 md5 之后都是202CB962AC59075B964B07152D234B70,但是 我加上盐,即 123+随机数,那么md5值不就不一样了吗? 这个随机数,就是盐而这个随机数也会在数据库里保存下来,每个不同的用户,随机数也是不一样的。
再就是加密次数,加密一次是202CB962AC59075B964B07152D234B70,我可以加密两次呀,就是另一个数了。 而黑客即便是拿到了加密后的密码,如果不知道到底加密了多少次,也是很难办的。

在代码里就演示了,如何用Shiro自带的工具类,做生成盐,两次md5的做法,如图所示得到一串机密都很高的密文。

package com.how2java;

import org.apache.shiro.crypto
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值