Shiro密码的MD5加密

    散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5、SHA等。一般进行散列时最好提供一个salt(盐),比如加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一些md5解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如用户名和ID(即盐);这样散列的对象是“密码+用户名+ID”,这样生成的散列值相对来说更难破解。

在你的用户数据库当中,储存的应该是已经加密后的密码,而不是明文的"admin",而且这个过程是不可逆的,并且注册的时候还得形成加密密码的唯一性,要不然密码的出现也就毫无意义了!

一丶xml的配置

<!-- 自定义的 Remal -->
	<bean   id="systemAuthorizingRealm" class="com.demo.Realm.UserRealm">
	 <!-- 配置密码匹配器 -->
        <property name="credentialsMatcher">
            <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                <property name="hashAlgorithmName" value="MD5"></property> <!-- 加密算法的名称 -->
                <property name="hashIterations" value="1024"></property> <!-- 配置加密的次数 -->
            </bean>
        </property>
	</bean>


二丶自定义Remal的认证过程

//角色验证
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		// TODO Auto-generated method stub
		
		UsernamePasswordToken upToken = (UsernamePasswordToken)token;
		String username = upToken.getUsername();
		
		
		User user = userService.getUserByUSername(username);
		if(user ==null){
			throw new UnknownAccountException("用户不存在!");
		}
		/*if ("monster".equals(username)) {
            throw new LockedAccountException("用户被锁定");
        }*/
		
		
		Object principal = username;
	    String credentials = user.getPassword();
		String realmName = getName();
		ByteSource credentialsSalt = ByteSource.Util.bytes(username);
		SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials,credentialsSalt,realmName);
		return info;
	}

由于我没写注册的业务逻辑,我是直接用下面的代码段得到的加密密码!
public static void main(String[] args){
		
		
	/*	//md5加密
		String hashAlgorithmName = "MD5";
        String credentials = "admin";
        int hashIterations = 1024;
        Object obj = new SimpleHash(hashAlgorithmName, credentials, null, hashIterations);
        System.out.println(obj);*/
        
        
        String hashAlgorithmName = "MD5";
        String credentials = "admin";
        int hashIterations = 1024;
        ByteSource credentialsSalt = ByteSource.Util.bytes("admin");
        Object obj = new SimpleHash(hashAlgorithmName, credentials, credentialsSalt, hashIterations);
        System.out.println(obj);
		
	}

上面的代码中第一段是无加盐的,md5加密,这种方式的局限性就是当你加密前的密码相同时你加密所得到的密码也是一样的,这显然不符合我们现实的需要,于是出现了下面的这种,加盐的md5加密,所谓加盐指的是,给md5一段唯一标识的字符串,让它把这个字符串加到加密运算的过程当中,从而得到一串唯一的密码,一般我们加的盐都是用户名,这就解释了大多数的注册界面中都会检测用户名是否重复的原因了!

相关链接,关于Shiro加密的 更多信息



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值