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(); }