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),要解密也的逐条进解密,因为我们每个加的盐都是不一样的 。
- JWT-RESTful进行身份认证
- openssl加密机制
- springBoot2.0 配置shiro实现权限管理
- 爬虫遇到字体动态加密?这样来解决
- ZIP伪加密与音频拨号隐写 —— 【高校战“疫”】隐藏的信息
- Java中加密算法介绍及其实现
- 数据库身份证号加密密码加密_您是否应该加密数据库中的电子邮件
- java 加密结果不一致的各个坑
- CAD图纸加密软件——公司核心文件数据防泄密「天锐绿盾」
- 常见哈希算法;加密算法,对称式加密与非对称式加密的对比