編碼與解碼
Shiro 提供了 base64 和 16 進(jìn)制字符串編碼莉兰、解碼的API 支持,方便一些編碼解碼操作。Shiro 內(nèi)部的一些數(shù)據(jù)的存儲(chǔ)恬涧、表示都使用了base64 和 16 進(jìn)制字符串。
1碴巾、base64 編碼與解碼
String str?= "admin";
String base64Encoded?= Base64.encodeToString(str.getBytes());
String str2?= Base64.decodeToString(base64Encoded);
logger.info(str+"<==="+base64Encoded+"==>"+str2);
2溯捆、16 進(jìn)制字符串編碼與解碼
String str3?= "test";
String hexEncoded2?= Hex.encodeToString(str3.getBytes());
String str4?= new?String(Hex.decode(hexEncoded2.getBytes()));
logger.info(str3+"<==="+hexEncoded2+"==>"+str4);
散列算法加密
散列算法一般用于生成數(shù)據(jù)的重要信息,是一種不可逆的算法厦瓢,適合存儲(chǔ)密碼之類(lèi)的數(shù)據(jù)提揍,常見(jiàn)的散列算法如MD5、SHA 等煮仇。
[if !supportLists]1劳跃、[endif]MD5算法鹽值加密
String pswd= "123456";
String salt?= "123";
String md5?= new?Md5Hash(pswd, salt).toString();
另外散列時(shí)還可以指定散列次數(shù),new Md5Hash(pswd, salt, 2).toString(),數(shù)字2代表加密次數(shù)。
[if !supportLists]2浙垫、[endif]SHA256 算法鹽值加密
String pswd= "123456";
String salt?= "123";
String sha?= new?Sha256Hash(pswd, salt).toString();
[if !supportLists]3刨仑、[endif]SHA1算法鹽值加密
String pswd= "123456";
String salt?= "123";
String sha?= new?Sha1Hash(pswd, salt).toString();
4、SHA512算法鹽值加密
String pswd?= "123456";
String salt?= "123";
String sha?= new?Sha512Hash(pswd, salt).toString();
[if !supportLists]5夹姥、[endif]Shiro 還提供了通用的散列SimpleHash
String pswd?= "123456";
String salt?= "123";
//內(nèi)部使用MessageDigest
String?simpleHash=
new?SimpleHash("SHA-1",pswd,salt,4).toString();
Shiro 還提供對(duì)稱(chēng)式加密杉武、解密算法的支持
[if !supportLists]1、[endif]AES 算法
//生成key
Key key?= aesCipherService.generateNewKey();
String pswd?= "123456";
//加密
String encrptText?= aesCipherService.encrypt(pswd.getBytes(), key.getEncoded()).toHex();
//解密
String text2?=
new?String(aesCipherService.decrypt(Hex.decode(encrptText), key.getEncoded()).getBytes());
logger.info(pswd+"<==="+encrptText+"==>"+text2);
簡(jiǎn)單模擬用戶(hù)注冊(cè)
1佃声、首先使用SHA256算法加密密碼明文艺智,UserService層實(shí)現(xiàn)。
UserDaoImpl userDaoimpl?;
public?static?void?main(String[] args) {
String email?="123@qq.com";
String password?= "123";
String sha?= new?Sha256Hash(password, ByteSource.Util.bytes(email)).toString();//使用郵箱作為鹽值
User user?= new?User(4L,"管理員",email,sha,new?Date(),new?Date(),1);
UserService userService?= new?UserService();
userService.insert(user);
}
public??int?insert(User user){
userDaoimpl?=new?UserDaoImpl();
return?userDaoimpl.insert(user);
}
2圾亏、Dao插入數(shù)據(jù)
@Override
public?int?insert(User record) {
String sql?= "insert into u_user(id,nickname,email,pswd,create_time,last_login_time,status) values (?,?,?,?,?,?,?)";
return?insert(sql,record.getId(),record.getNickname(),record.getEmail(),record.getPswd(),record.getCreateTime(),record.getLastLoginTime(),record.getStatus());
}
HashedCredentialsMatcher 實(shí)現(xiàn)密碼驗(yàn)證服務(wù)
1十拣、自定義JdbcRealm實(shí)現(xiàn)AuthorizingRealm接口,重寫(xiě)doGetAuthenticationInfo(,,,)方法志鹃。
[if !supportLists]2夭问、[endif]配置ini文件內(nèi)容
主要配置HashedCredentialsMatcher實(shí)現(xiàn)密碼驗(yàn)證服務(wù)。
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
credentialsMatcher.hashAlgorithmName=SHA-256#加密算法
credentialsMatcher.hashIterations=1#迭代次數(shù)
credentialsMatcher.storedCredentialsHexEncoded=true
jdbcRealm=com.shiro.test.JdbcRealm
jdbcRealm.credentialsMatcher=$credentialsMatcher
securityManager.realms=$jdbcRealm
3曹铃、]用郵箱缰趋、密碼實(shí)現(xiàn)登錄認(rèn)證
4、結(jié)果