Spring shiro加密算法


1. Base64

Base64用于网络中传输的数据进行编码,严格意义上属于编码的格式,有64个字符的对应的编码,Base64就是将内容按照该格式进行编码。可以对数据编码和解码,是可逆的,安全度较低,不过,也可以作为最基础最简单的加密算法用于加密要求较弱的情况

1.1 JDK自带的类实现

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;

public class Base64{

    public static void main(String[] args) {
        String src="Hello Base64"; //需要加密的数据
        try {
            BASE64Encoder encoder=new BASE64Encoder();
            String encode = encoder.encode(src.getBytes());
            System.out.println("加密: "+encode);

            BASE64Decoder decoder=new BASE64Decoder();
            String decode=new String(decoder.decodeBuffer(encode));
            System.out.println("解密: "+decode);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

加密: SGVsbG8gQmFzZTY0
解密: Hello Base64

1.2 spring shiro实现

pom.xml中导入依赖:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.3.2</version>
</dependency>
<!--guava包中有校验数据合法性的方法,引入后可直接使用-->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>24.0-jre</version>
</dependency>

实现加密:

import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import org.apache.shiro.codec.Base64;

public class shiroBase64{

	/*Preconditions验证数据是否正确*/
    /*加密*/
    public static String encrytBase64(String password) {
        Preconditions.checkArgument(!Strings.isNullOrEmpty(password), "密码不能为空");
        byte[] bytes = password.getBytes();
        return Base64.encodeToString(bytes);
    }
    /*解密*/
    public static String decryptBase64(String password) {
        Preconditions.checkArgument(!Strings.isNullOrEmpty(password), "密码不能为空");
        return Base64.decodeToString(password);
    }

    public static void main(String[] args) {
        String encryt = encrytBase64("123456");
        String decrypt = decryptBase64(encryt);
        System.out.println("加密后: "+encryt);
        System.out.println("解密:" +decrypt);
    }

}

运行结果:

加密后: MTIzNDU2
解密:123456

2. 16进制加解密

shiro框架自带的HEX 16进制加解密

import org.apache.shiro.codec.Hex;
import org.junit.Test;
public  class HEX16 {
    /*16进制加密*/
    public static String encrytHex(String password) {
        byte[] bytes = password.getBytes();
        return Hex.encodeToString(bytes);
    }
    /*16进制解密*/
    public static String decryptHex(String password) {
        return new String(Hex.decode(password));
    }
    @Test
    public void Hex_Test(){
        String encryt = encrytHex("123456");
        String decrypt = decryptHex(encryt);
        System.out.println("16进制加解密");
        System.out.println("加密后: "+encryt);
        System.out.println("解密:" +decrypt);
    }
}

运行结果:

加密后: 313233343536
解密:123456

3. MD5

  • 散列算法一般用于生成一段文本的摘要信息,散列算法不可逆,将内容可以生成摘要,无法将摘要转成原始内容。

  • 常用的散列算法有MD5、SHA。

  • 一般散列算法需要提供一个salt(盐)与原始内容生成摘要信息,这样做的目的是为了安全性,当盐的值不同时,加密后的数据也不同,防止通过撞库来实现MD5解密;

shiro框架自带的Md5Hash散列算法和SimpleHash加密:

import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.junit.Test;

public class MD5_salt {

    @Test
    public void test1(){
        String password_md5=new Md5Hash("111111").toString();
        System.out.println("MD5加密不加盐:  "+password_md5);
        String password_md5_salt_1=new Md5Hash("111111","hhh",1).toString();
        System.out.println("MD5加密加盐一次散列:  "+password_md5_salt_1);
        String password_md5_salt_2=new Md5Hash("111111","hhh",2).toString();
        //两次散列相当于 md5(md5(加密内容))
        System.out.println("MD5加密加盐二次散列:  "+password_md5_salt_2);

        String simpleHash=new SimpleHash("MD5","111111","hhh",1).toString();
        System.out.println("使用SimpleHash加密:  "+simpleHash);
    }
}

运行结果:

MD5加密不加盐:  96e79218965eb72c92a549dd5a330112
MD5加密加盐一次散列:  78c247d5a8c436e028fccd6972f93c31
MD5加密加盐二次散列:  737d18e71a77f3c6f01e435a9193b563
使用SimpleHash加密:  78c247d5a8c436e028fccd6972f93c31

4. 随机数加密

import org.apache.shiro.crypto.SecureRandomNumberGenerator;

public class randomNum {
    public static void main(String[] args) {
        SecureRandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();
        randomNumberGenerator.setSeed("abc123".getBytes());
        String hex = randomNumberGenerator.nextBytes().toHex();
        System.out.println(hex);
        //输出结果6691484ea6b50ddde1926a220da01fa9
    }
}

5. AES对称加密算法

每次数据加密后生成的密钥都不一样,但是解密后只对应加密前的数据

import org.apache.shiro.codec.Hex;
import org.apache.shiro.crypto.AesCipherService;
import java.security.Key;

public class AES {
    public static void main(String[] args) {
        AesCipherService aesCipherService = new AesCipherService();
        aesCipherService.setKeySize(128); //设置key长度
        Key key = aesCipherService.generateNewKey();
        String text = "helloworld";
        //加密
        String encText = aesCipherService.encrypt(text.getBytes(), key.getEncoded()).toHex();
        System.out.println("加密: "+encText);
        //解密
        String decText = new String(aesCipherService.decrypt(Hex.decode(encText), key.getEncoded()).getBytes());
        System.out.println("解密: "+decText);
    }
}

运行结果:

加密: 0c7384afaeb5c5e7e8c04605d6e4a48456173a74e4390c93db4b401b6a76d96f
解密: helloworld
数据加解密
Spring shiro
  • 作者:管理员(联系作者)
  • 发表时间:2019-11-19 17:47
  • 版权声明:自由转载-非商用-非衍生-保持署名(null)
  • undefined
  • 评论