散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如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加密的
更多信息!