shiro之編碼加密

1、Shiro 提供了base64和16進制字符串編碼/解碼的API支持:java

String str = "h";
		//base64 編碼
		String base64Encoded = Base64.encodeToString(str.getBytes());
		//base64 編碼解碼
		String str2 = Base64.decodeToString(base64Encoded);
		System.out.println(str.equals(str2));
		
		String str3 = "y";
		//16進制字符串編碼
		String hexEncoded = Hex.encodeToString(str3.getBytes());
		//16進制字符串解碼
		String str4 = new String(Hex.decode(hexEncoded));
		System.out.println(str3.equals(str4));
		//byte數組與String轉換
		CodecSupport.toBytes(str, "utf-8");
		CodecSupport.toString(str.getBytes(), "utf-8");

2、散列算法算法

散列算法通常用於生成數據的摘要信息,是一種不可逆的算法,通常適合存儲密碼之類的數據,常見的散列算法如MD五、SHA等。數據庫

String str = "h";
		String salt = "123"; //鹽
		//單純md5加密,易破解
		System.out.println(new Md5Hash(str).toString());
		//加干擾數據,即鹽
		System.out.println(new Md5Hash(str,salt).toString());
		//指定散列次數,如2次::md5(md5(str))
		System.out.println(new Md5Hash(str,salt,2).toString());
		//SHA256 算法 還有如SHA一、SHA512算法
		System.out.println(new Sha256Hash(str,salt).toString());
		//shiro通用散列支持,內部使用了Java 的MessageDigest實現
		System.out.println(new SimpleHash("md5",str,salt).toString());

Shiro 提供了HashService,默認提供了DefaultHashService實現數組

//建立一個DefaultHashService,默認使用SHA-512 算法;
		DefaultHashService hashService = new DefaultHashService();
		//修改算法
		hashService.setHashAlgorithmName("md5");
		//設置一個私鹽,其在散列時自動與用戶傳入的公鹽混合產生一個新鹽
		hashService.setPrivateSalt(new SimpleByteSource("123"));
		//在用戶沒有傳入公鹽的狀況下是否生成公鹽,默認false
		hashService.setGeneratePublicSalt(true);
		//用於生成公鹽
		hashService.setRandomNumberGenerator(new SecureRandomNumberGenerator());
		//修改默認加密迭代次數
		hashService.setHashIterations(2);
		//構建一個HashRequest,傳入算法、數據、公鹽、迭代次數。
		HashRequest request = new HashRequest.Builder().setAlgorithmName("md5")
				.setSource(ByteSource.Util.bytes("h"))
				.setSalt(ByteSource.Util.bytes("123"))
				.setIterations(2).build();
		System.out.println(hashService.computeHash(request).toString());
		
		//SecureRandomNumberGenerator用於生成一個隨機數
		SecureRandomNumberGenerator srng = new SecureRandomNumberGenerator();
		srng.setSeed("123".getBytes());
		System.out.println(srng.nextBytes().toHex());

3、加密、解密dom

Shiro 還提供對稱式加密/解密算法的支持,如AES、Blowfish 等ui

//AES算法
		AesCipherService acs = new AesCipherService();
		acs.setKeySize(128);//key長度
		Key key = acs.generateNewKey();//生成key
		String str = "h";
		//加密
		String encrptText = acs.encrypt(str.getBytes(), key.getEncoded()).toHex();
		System.out.println(encrptText);
		//解密
		String str2 = new String(acs.decrypt(Hex.decode(encrptText), key.getEncoded()).getBytes());
		System.out.println(str2);

4、PasswordService/CredentialsMatcherthis

Shiro 提供了PasswordService及CredentialsMatcher用於提供加密密碼及驗證密碼服務。編碼

public interface PasswordService {
//輸入明文密碼獲得密文密碼
String encryptPassword(Object plaintextPassword) throws IllegalArgumentException;
}
public interface CredentialsMatcher {
//匹配用戶輸入的token 的憑證(未加密)與系統提供的憑證(已加密)
boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info);
}

Shiro 默認提供了PasswordService 實現DefaultPasswordService;CredentialsMatcher 實現PasswordMatcher及HashedCredentialsMatcher加密

簡單使用:code

service層加密密碼保存到數據庫

//加密密碼
user.setPassword(passwordService.encryptPassword(user.getPassword()));

登陸時realm驗證

SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
				account,user.getPassword(),this.getName());
		System.out.println("匹配=>"+credentialsMatcher.doCredentialsMatch(token,authenticationInfo));
		if( !credentialsMatcher.doCredentialsMatch(token,authenticationInfo)){
			throw new IncorrectCredentialsException();
		}
相關文章
相關標籤/搜索