Shiro学习(三)之MD5+随机盐salt+Hash散列认证

MD5:

  1. 加密算法不可逆(只能根据明文生成密文;如果内容相同,不论执行多少次md5生成结果始终一致),通常和随机盐配合使用

  2. 一般用来加密或签名

  3. 签名:也称为校验和,就是用来判断两个内容是否一致
    eg: tomcat.zip tomcat.md5. fdfd… 看是否下载完整,就可以点击tomcat.md5. 看生成的签名和tomcat生成的是否一致
    两个文件是否一致?a.txt 和bb.txt 分别md5 看签名是否一致

  4. 破解网站的原理:穷举算法

  5. 为了解决穷举网站反推出明文,尽可能不使用123 6个8这种简单的明文

  6. 生成结果:始终是一个16进制,32位长度字符串

MD5加密认证流程

reg.html->用户名、密码->提交->后台web应用处理(业务层进行操作)
在做md5之前应该先进行加盐的操作
登录和注册中md5加盐要一致

public static void main(String[] args) {
   // 1. 创建securityManager安全管理器
   DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
   // 1.1 注入realm
   CustomerMd5Realm realm = new CustomerMd5Realm();
   // 1.2 设置realm使用hash凭证匹配器(会先对用户的密码进行md5加密 )
   HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
   // 使用算法
   hashedCredentialsMatcher.setHashAlgorithmName("md5");// 凭证很多,这里使用md5
   // 散列次数
   hashedCredentialsMatcher.setHashIterations(1024);
   realm.setCredentialsMatcher(hashedCredentialsMatcher);
   // 2. 设置自定义realm
   defaultSecurityManager.setRealm(realm);
   // 3. 将安全工具类设置安全管理器
   SecurityUtils.setSecurityManager(defaultSecurityManager);
   // 4. 通过安全工具类获取Subject
   Subject subject = SecurityUtils.getSubject();
   // 5. 创建令牌(相当于用户输入的)
   UsernamePasswordToken token = new UsernamePasswordToken("xiaochen", "123");
   // 6. 登录
   try {
       subject.login(token);
       System.out.println("认证是否通过:"+subject.isAuthenticated());
   } catch (UnknownAccountException e) {
       e.printStackTrace();
       System.out.println("用户名错误");
   } catch (IncorrectCredentialsException e) {
       e.printStackTrace();
       System.out.println("密码错误");
   }
}

你可能感兴趣的:(Shiro,shiro)