zoukankan      html  css  js  c++  java
  • (七)shiro之编码/加密

    一、编码/解码

    • 使用Base64编码/解码操作
    public class TestMain {
        public static void main(String[] args) {
            SecurityManager securityManager=new IniSecurityManagerFactory("classpath:shiro.ini").getInstance(); 
            SecurityUtils.setSecurityManager(securityManager);
    
            String str="hello";
            String base64String=Base64.encodeToString(str.getBytes());
    
            String decodeStr=Base64.decodeToString(base64String);
            
            System.out.println(str==decodeStr);
            System.out.println(str);
            System.out.println(decodeStr);
            System.out.println(str.equals(decodeStr));
        }
    }

    结果:

    • 使用16进制字符串编码/解码操作
    public class TestMain {
        public static void main(String[] args) {
            SecurityManager securityManager=new IniSecurityManagerFactory("classpath:shiro.ini").getInstance(); 
            SecurityUtils.setSecurityManager(securityManager);
            
        
            String str="hello";
            String base64String=Hex.encodeToString(str.getBytes());
    
            String decodeStr=new String(Hex.decode(base64String.getBytes()));
            
            System.out.println(str==decodeStr);
            System.out.println(str);
            System.out.println(decodeStr);
            System.out.println(str.equals(decodeStr));
       
        }
    }

     二、散列算法

    •  散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5、SHA等。一般进行散列时最好提供一个salt(盐),比如加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一些md5解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如用户名和ID(即盐);这样散列的对象是“密码+用户名+ID”,这样生成的散列值相对来说更难破解。

       2.1  案例一

    public class TestMain {
        public static void main(String[] args) {
        
            String userName="admin";
            String passWord="123520";
            String userId="1";
            
            /**
             * 通过盐"123520"和"1"MD5散列“admin”。另外散列时还可以指定散列次数,如2次表示:md5(md5(str)):“new Md5Hash(str, salt, 2).toString()”。
             */
            String md5=new Md5Hash(userName, passWord+userId).toString();
            System.out.println(md5);
            
            /**
             * 使用SHA256算法生成相应的散列数据,另外还有如SHA1、SHA512算法。   
             */
            String sha1 = new Sha256Hash(userName, passWord+userId).toString();   
            System.out.println(sha1);
        }
    }

    结果:

       2.2  使用HashService,默认提供了DefaultHashService实现。

    public class TestMain {
        public static void main(String[] args) {
        
            DefaultHashService hashService = new DefaultHashService(); //默认算法SHA-512  
            hashService.setHashAlgorithmName("SHA-512");  
            hashService.setPrivateSalt(new SimpleByteSource("123")); //私盐,默认无  
            hashService.setGeneratePublicSalt(true);//是否生成公盐,默认false  
            hashService.setRandomNumberGenerator(new SecureRandomNumberGenerator());//用于生成公盐。默认就这个  
            hashService.setHashIterations(1); //生成Hash值的迭代次数  
              
            HashRequest request = new HashRequest.Builder()  
                        .setAlgorithmName("MD5").setSource(ByteSource.Util.bytes("hello"))  
                        .setSalt(ByteSource.Util.bytes("123")).setIterations(2).build();  
            String hex = hashService.computeHash(request).toHex(); 
            System.out.println(hex);
        }
    }
    • 1、首先创建一个DefaultHashService,默认使用SHA-512算法;

      2、可以通过hashAlgorithmName属性修改算法;

      3、可以通过privateSalt设置一个私盐,其在散列时自动与用户传入的公盐混合产生一个新盐;

      4、可以通过generatePublicSalt属性在用户没有传入公盐的情况下是否生成公盐;

      5、可以设置randomNumberGenerator用于生成公盐;

      6、可以设置hashIterations属性来修改默认加密迭代次数;

      7、需要构建一个HashRequest,传入算法、数据、公盐、迭代次数。

    三、加密/解密

    public class TestMain {
        public static void main(String[] args) {
    
            String str = "hello";
            AesCipherService aesCipherService = new AesCipherService();
            //设置key长度
            aesCipherService.setKeySize(128);
            //生成key 
            Key key = aesCipherService.generateNewKey();
    
            //加密,然后吧加密结果转为Hex编码
            String encrptText = aesCipherService.encrypt(str.getBytes(), key.getEncoded()).toHex();
            
            //解密,首先要把加密的结构用Hex解码后在解密
            String decrpteText=new String(aesCipherService.decrypt(Hex.decode(encrptText),key.getEncoded()).getBytes());
            
            System.out.println(str.equals(decrpteText));
            
            System.out.println(encrptText);
            
        }
    }

     to be http://jinnianshilongnian.iteye.com/blog/2021439 5.4

  • 相关阅读:
    Kinect 开发 —— 硬件设备解剖
    Kinect 开发 —— 引言
    (转)OpenCV 基本知识框架
    OpenCV —— 摄像机模型与标定
    OpenCV —— 跟踪与运动
    OpenCV —— 图像局部与分割(二)
    OpenCV —— 图像局部与部分分割(一)
    OpenCV —— 轮廓
    OpenCV —— 直方图与匹配
    OpenCV —— 图像变换
  • 原文地址:https://www.cnblogs.com/shyroke/p/7860333.html
Copyright © 2011-2022 走看看