更新時間:2020-08-14 來源:黑馬程序員 瀏覽量:
Shiro提供了base64和16進制字符串編碼/解碼的API支持,方便一些編碼解碼操作。
Shiro內(nèi)部的一些數(shù)據(jù)的【存儲/表示】都使用了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轉(zhuǎn)換 * @param input 輸入數(shù)組 * @return String */ public static String encodeHex(byte[] input){ return Hex.encodeToString(input); } /** * @Description HEX-String--byte[]轉(zhuǎn)換 * @param input 輸入字符串 * @return byte數(shù)組 */ public static byte[] decodeHex(String input){ return Hex.decode(input); } /** * @Description Base64-byte[]--String轉(zhuǎn)換 * @param input 輸入數(shù)組 * @return String */ public static String encodeBase64(byte[] input){ return Base64.encodeToString(input); } /** * @Description Base64-String--byte[]轉(zhuǎn)換 * @param input 輸入字符串 * @return byte數(shù)組 */ 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("比較結(jié)果:"+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("比較結(jié)果:"+val.equals(valHandler)); } }
【1.5】小結(jié)
1、shiro目前支持的編碼與解碼:
·base64
·(HEX)16進制字符串
2、那么shiro的編碼與解碼什么時候使用呢?又是怎么使用的呢?
【2】散列算法
散列算法一般用于生成數(shù)據(jù)的摘要信息,是一種不可逆的算法,一般適合存儲密碼之類的數(shù)據(jù),常見的散列算法如MD5、SHA等。一般進行散列時最好提供一個salt(鹽),比如加密密碼“admin”,產(chǎn)生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一些md5解密網(wǎng)站很容易的通過散列值得到密碼“admin”,即如果直接對密碼進行散列相對來說破解更容易,此時我們可以加一些只有系統(tǒng)知道的干擾數(shù)據(jù),如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("比較結(jié)果:"+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("比較結(jié)果:"+val.equals(valHandler)); } @Test public void testDigestsUtil(){ Map<String,String> map = DigestsUtil.entryptPassword("123"); System.out.println("獲得結(jié)果:"+map.toString()); } }
猜你喜歡: