shiro编码和加密代码详解

  

涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码。比如之前的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编码和加密代码详解