【1】編碼與解碼
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());
}
}
猜你喜歡:
Shiro教程:Realm接口實現(xiàn)方式
Shiro身份認證流程
Java高級軟件工程師培訓(xùn)課程