shiro_02_身份认证加密( 三 )

contextConfigLocationclasspath:applicationContext.xmlorg.springframework.web.context.ContextLoaderListenerSpringMVCorg.springframework.web.servlet.DispatcherServletcontextConfigLocation/WEB-INF/springmvc-servlet.xml1trueSpringMVC/encodingFilterorg.springframework.web.filter.CharacterEncodingFiltertrueencodingUTF-8encodingFilter/*shiroFilterorg.springframework.web.filter.DelegatingFilterProxytargetFilterLifecycletrueshiroFilter/*
4.在这里新建一个包,里面放.java
package com.jwj.shiro;import org.apache.shiro.crypto.RandomNumberGenerator;import org.apache.shiro.crypto.SecureRandomNumberGenerator;import org.apache.shiro.crypto.hash.SimpleHash;/*** 用于shiro权限认证的密码工具类*/public class PasswordHelper {/*** 随机数生成器* 生成的盐*/private static RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();/*** 指定hash算法为MD5* 采用什么加密方式*/private static final String hashAlgorithmName = "md5";/*** 指定散列次数为1024次,即加密1024次* 加密1024次,解密也是1024次*/private static final int hashIterations = 1024;/*** true指定Hash散列值使用Hex加密存. false表明hash散列值用用Base64-encoded存储* 你是不是base64位的进行存储*/private static final boolean storedCredentialsHexEncoded = true;/*** 获得加密用的盐* 随机生成的盐* @return*/public static String createSalt() {return randomNumberGenerator.nextBytes().toHex();}/*** 获得加密后的凭证*生成一个秘密* @param credentials 凭证(即密码)* @param salt盐* @return* 原始密码 + 盐=加密后的返回值String就是加密后的*/public static String createCredentials(String credentials, String salt) {SimpleHash simpleHash = new SimpleHash(hashAlgorithmName, credentials,salt, hashIterations);return storedCredentialsHexEncoded ? simpleHash.toHex() : simpleHash.toBase64();}/*** 进行密码验证* 校验我的密码** @param credentials未加密的密码* @param salt盐* @param encryptCredentials 加密后的密码* @return**/public static boolean checkCredentials(String credentials, String salt, String encryptCredentials) {return encryptCredentials.equals(createCredentials(credentials, salt));}public static void main(String[] args) {//盐生成随机的盐String salt = createSalt();System.out.println(salt);//拿到盐生成的长度System.out.println(salt.length());//凭证+盐加密后得到的密码String credentials = createCredentials("123456", salt);System.out.println(credentials);//加密后的长度System.out.println(credentials.length());//拿到加密后的密码和原始化的密码如果为true,就代码加密成功了boolean b = checkCredentials("123456", salt, credentials);System.out.println(b);}}
运行一下如图所示:
原始密码

32
加密后
32
true
拿到原始密码和盐以及加密后的密码做对比如果为true说明加密成功
我们在运行一次看看这两者之间是不是一样的如图所示:
可以看到明显的不一样了,盐不一样了也就会导致加密后的也不一样了
如果说你有一万数据被泄露了,它要解密这些东西,它首先要拿到加密的次数(1024),要解密也的逐条进解密,因为我们每个加的盐都是不一样的 。