-
Shiro提供了base64和16进制字符串编码/解码的API支持,方便一些编码解码操作
-
Shiro内部的一些数据的【存储/表示】都使用了base64和16进制字符串
-
散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5、SHA等。一般进行散列时最好提供一个salt(盐),比如加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一些md5解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如salt(即盐);这样散列的对象是“密码+salt”,这样生成的散列值相对来说更难破解。
-
shiro支持的散列算法
| Md2Hash、Md5Hash、Sha1Hash、Sha256Hash、Sha384Hash、Sha512Hash |
| |
| <dependencies> |
| <dependency> |
| <groupId>commons-logging</groupId> |
| <artifactId>commons-logging</artifactId> |
| <version>1.1.3</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.shiro</groupId> |
| <artifactId>shiro-core</artifactId> |
| <version>1.3.2</version> |
| </dependency> |
| <dependency> |
| <groupId>junit</groupId> |
| <artifactId>junit</artifactId> |
| <version>4.11</version> |
| </dependency> |
| </dependencies> |
| public class EncodesUtil { |
| |
| |
| |
| |
| |
| |
| public static String encodeHex(byte[] input){ |
| return Hex.encodeToString(input); |
| } |
| |
| |
| |
| |
| |
| |
| public static byte[] decodeHex(String input){ |
| return Hex.decode(input); |
| } |
| |
| |
| |
| |
| |
| |
| public static String encodeBase64(byte[] input){ |
| return Base64.encodeToString(input); |
| } |
| |
| |
| |
| |
| |
| |
| public static byte[] decodeBase64(String input){ |
| return Base64.decode(input); |
| } |
| |
| } |
| public class DigestsUtil { |
| |
| private static final String SHA1 = "SHA-1"; |
| |
| private static final Integer ITERATIONS =512; |
| |
| |
| |
| |
| |
| |
| |
| public static String sha1(String input, String salt) { |
| return new SimpleHash(SHA1, input, salt,ITERATIONS).toString(); |
| } |
| |
| |
| |
| |
| |
| public static String generateSalt(){ |
| SecureRandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator(); |
| return randomNumberGenerator.nextBytes().toHex(); |
| } |
| |
| |
| |
| |
| |
| |
| 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; |
| } |
| } |
| public class ClientTest { |
| |
| |
| |
| |
| @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)); |
| } |
| |
| |
| |
| |
| @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()); |
| } |
| |
| } |
| 比较结果:true |
| 比较结果:true |
| 获得结果:{password=cc58b3f552a3f40fd2f372457c7b9c622ee42776, salt=1c4123b2b3cb9bc9c133229f5928b2b9} |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?