涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码。比如之前的600 w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储。
Shiro提供了base64和16进制字符串编码/解码的API的支持,方便一些编码解码操作.Shiro内部的一些数据的存储/表示都使用了base64和16进制字符串。
Java代码,,
字符串str=澳愫谩? 字符串base64Encoded=Base64.encodeToString (str.getBytes ()); 字符串str2=Base64.decodeToString (base64Encoded); 断言。assertequal (str, str2);>之前通过如上方式可以进行base64编码/解码操作,更多API请参考其Javadoc。
Java代码,,
字符串str=澳愫谩? 字符串base64Encoded=Hex.encodeToString (str.getBytes ()); 字符串str2=新的字符串(Hex.decode (base64Encoded.getBytes ())); 断言。assertequal (str, str2);>之前通过如上方式可以进行16进制字符串编码/解码操作,更多API请参考其Javadoc只
还有一个可能经常用到的类CodecSupport,提供了toBytes (str,“utf - 8”)/toString(字节,“utf - 8”)用于在字节数组/字符串之间转换只
散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5,沙等。一般进行散列时最好提供一个盐(盐),比如加密密码“admin”,产生的散列值是“21232 f297a57a5a743894a0e4a801fc3”,可以到一些MD5解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如用户名和ID(即盐);这样散列的对象是“密码+用户名+ ID”,这样生成的散列值相对来说更难破解。
Java代码,,
字符串str=澳愫谩? 字符串盐=" 123 "; 字符串md5=new Md5Hash (str,盐).toString();//还可以转换为toBase64 ()/toHex ()如上代码通过盐“123”MD5散列“hello”。另外散列时还可以指定散列次数,如2次表示:MD5 (MD5 (str)):“新Md5Hash (str,盐,2).toString()只,
Java代码,,
字符串str=澳愫谩? 字符串盐=" 123 "; 字符串sha1=new Sha256Hash (str,盐).toString ();>之前使用SHA256算法生成相应的散列数据,另外还有如SHA1, SHA512算法只,,,,,
Shiro还提供了通用的散列支持:
Java代码,,
字符串str=澳愫谩? 字符串盐=" 123 ";//内部使用MessageDigest 字符串simpleHash=new simpleHash (“sha - 1”, str,盐).toString ();>之前通过调用SimpleHash时指定散列算法,其内部使用了Java的MessageDigest实现只
为了方便使用,Shiro提供了HashService,默认提供了DefaultHashService实现。
Java代码,,
DefaultHashService hashService=new DefaultHashService ();//默认算法sha - 512 hashService.setHashAlgorithmName (sha - 512); hashService。setPrivateSalt(新SimpleByteSource (" 123 "));//私盐,默认无 hashService.setGeneratePublicSalt(真正);//是否生成公盐,默认假 hashService。setRandomNumberGenerator(新SecureRandomNumberGenerator());//用于生成公盐。默认就这个 hashService.setHashIterations (1);//生成散列值的迭代次数 HashRequest请求=new HashRequest.Builder () .setAlgorithmName (MD5) .setSource (ByteSource.Util.bytes (“hello”)) .setSalt (ByteSource.Util.bytes (" 123 ")) .setIterations (2) .build (); 十六进制字符串=hashService.computeHash(请求).toHex ();>之前1,首先创建一个DefaultHashService,默认使用sha - 512算法;
2,可以通过hashAlgorithmName属性修改算法;
3,可以通过privateSalt设置一个私盐,其在散列时自动与用户传入的公盐混合产生一个新盐;
4,可以通过generatePublicSalt属性在用户没有传入公盐的情况下是否生成公盐;
5,可以设置randomNumberGenerator用于生成公盐;
6,可以设置hashIterations属性来修改默认加密迭代次数;
7,需要构建一个HashRequest,传入算法,数据,公盐,迭代次数只
SecureRandomNumberGenerator用于生成一个随机数:
shiro编码和加密代码详解