更新时间:2020-08-14 来源:黑马程序员 浏览量:
Shiro提供了base64和16进制字符串编码/解码的API支持,方便一些编码解码操作。
Shiro内部的一些数据的【存储/表示】都使用了base64和16进制字符串。
【1.1】需求
理解base64和16进制字符串编码/解码
【1.2】新建项目
新建shiro-day01-03encode-decode
【1.3】新建EncodesUtil
package com.itheima.shiro.tools; import org.apache.shiro.codec.Base64; import org.apache.shiro.codec.Hex; /** * @Description:封装base64和16进制编码解码工具类 */ public class EncodesUtil { /** * @Description HEX-byte[]--String转换 * @param input 输入数组 * @return String */ public static String encodeHex(byte[] input){ return Hex.encodeToString(input); } /** * @Description HEX-String--byte[]转换 * @param input 输入字符串 * @return byte数组 */ public static byte[] decodeHex(String input){ return Hex.decode(input); } /** * @Description Base64-byte[]--String转换 * @param input 输入数组 * @return String */ public static String encodeBase64(byte[] input){ return Base64.encodeToString(input); } /** * @Description Base64-String--byte[]转换 * @param input 输入字符串 * @return byte数组 */ public static byte[] decodeBase64(String input){ return Base64.decode(input); } }
【1.4】新建ClientTest
package com.itheima.shiro.client; import com.itheima.shiro.tools.EncodesUtil; import org.junit.Test; /** * @Description:测试 */ public class ClientTest { /** * @Description 测试16进制编码 */ @Test public void testHex(){ String val = "holle"; String flag = EncodesUtil.encodeHex(val.getBytes()); String valHandler = new String(EncodesUtil.decodeHex(flag)); System.out.println("比较结果:"+val.equals(valHandler)); } /** * @Description 测试base64编码 */ @Test public void testBase64(){ String val = "holle"; String flag = EncodesUtil.encodeBase64(val.getBytes()); String valHandler = new String(EncodesUtil.decodeBase64(flag)); System.out.println("比较结果:"+val.equals(valHandler)); } }
【1.5】小结
1、shiro目前支持的编码与解码:
·base64
·(HEX)16进制字符串
2、那么shiro的编码与解码什么时候使用呢?又是怎么使用的呢?
【2】散列算法
散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5、SHA等。一般进行散列时最好提供一个salt(盐),比如加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一些md5解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如salt(即盐);这样散列的对象是“密码+salt”,这样生成的散列值相对来说更难破解。
shiro支持的散列算法:
Md2Hash、Md5Hash、Sha1Hash、Sha256Hash、Sha384Hash、Sha512Hash
【2.1】新增DigestsUtil
package com.itheima.shiro.tools; import com.sun.org.apache.bcel.internal.generic.NEW; import org.apache.shiro.crypto.SecureRandomNumberGenerator; import org.apache.shiro.crypto.hash.SimpleHash; import sun.security.util.Password; import java.util.HashMap; import java.util.Map; /** * @Description:摘要 */ public class DigestsUtil { private static final String SHA1 = "SHA-1"; private static final Integer ITERATIONS =512; /** * @Description sha1方法 * @param input 需要散列字符串 * @param salt 盐字符串 * @return */ public static String sha1(String input, String salt) { return new SimpleHash(SHA1, input, salt,ITERATIONS).toString(); } /** * @Description 随机获得salt字符串 * @return */ public static String generateSalt(){ SecureRandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator(); return randomNumberGenerator.nextBytes().toHex(); } /** * @Description 生成密码字符密文和salt密文 * @param * @return */ public static Map<String,String> entryptPassword(String passwordPlain) { Map<String,String> map = new HashMap<>(); String salt = generateSalt(); String password =sha1(passwordPlain,salt); map.put("salt", salt); map.put("password", password); return map; } }
【2.2】新增ClientTest
package com.itheima.shiro.client; import com.itheima.shiro.tools.DigestsUtil; import com.itheima.shiro.tools.EncodesUtil; import org.junit.Test; import java.util.Map; /** * @Description:测试 */ public class ClientTest { /** * @Description 测试16进制编码 */ @Test public void testHex(){ String val = "holle"; String flag = EncodesUtil.encodeHex(val.getBytes()); String valHandler = new String(EncodesUtil.decodeHex(flag)); System.out.println("比较结果:"+val.equals(valHandler)); } /** * @Description 测试base64编码 */ @Test public void testBase64(){ String val = "holle"; String flag = EncodesUtil.encodeBase64(val.getBytes()); String valHandler = new String(EncodesUtil.decodeBase64(flag)); System.out.println("比较结果:"+val.equals(valHandler)); } @Test public void testDigestsUtil(){ Map<String,String> map = DigestsUtil.entryptPassword("123"); System.out.println("获得结果:"+map.toString()); } }
猜你喜欢: