zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

数据加密的各种姿势

2023-04-18 13:16:58 时间

数据加密

数据按加密方式可分为对称加密和非对称加密和hash加密。

  • 对称加密:加解密密钥相同,假如有一把锁具,锁具在关闭(加密时)和开启(解密时)使用的是同一把钥匙(使用相同的密钥),则可以将该加密方式称为对称加密。常见的对称加密方式如:DES、3DES、Blowfish、IDEA、RC4、RC5、RC6 和 AES

图片源自网络

对称加密 AES demo

package com.module.boots.api.de.utils;
 
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
 
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
 
import org.apache.tomcat.util.codec.binary.Base64;
 
import com.module.boots.exception.CommonRuntimeException;
 
/**
 * AES加密解密
 * @author:Ltx
 * @date:2020年12月6日
 */
public class AesUtils {
 
    private static final String KEY_ALGORITHM = "AES";
 
    private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";// 默认的加密算法
 
    /**
     * AES 加密操作
     * @author Ltx
     * @param content 待加密内容
     * @param password 加密密码
     * @return String 返回Base64转码后的加密数据
     */
    public static String encrypt(String content, String password) {
        try {
            // 创建密码器
            final Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
            // 设置为UTF-8编码
            final byte[] byteContent = content.getBytes("utf-8");
            // 初始化为加密模式的密码器
            cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(password));
            // 加密
            final byte[] result = cipher.doFinal(byteContent);
            // 通过Base64转码返回
            return Base64.encodeBase64String(result);
 
        }
        catch (final Exception ex) {
            throw new CommonRuntimeException(ex.fillInStackTrace());
 
        }
    }
 
    /**
     * AES 解密操作
     * @author Ltx
     * @param content
     * @param password
     * @return String
     */
    public static String decrypt(String content, String password) {
        try {
            // 实例化
            final Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
            // 使用密钥初始化,设置为解密模式
            cipher.init(Cipher.DECRYPT_MODE, getSecretKey(password));
            // 执行操作
            final byte[] result = cipher.doFinal(Base64.decodeBase64(content));
            // 采用UTF-8编码转化为字符串
            return new String(result, "utf-8");
 
        }
        catch (final Exception ex) {
            throw new CommonRuntimeException(ex.fillInStackTrace());
        }
 
    }
 
    /**
     * 生成加密秘钥
     * @author Ltx
     * @param password 加密的密码
     * @return SecretKeySpec
     */
    private static SecretKeySpec getSecretKey(final String password) {
        // 返回生成指定算法密钥生成器的 KeyGenerator 对象
        KeyGenerator kg = null;
        try {
            kg = KeyGenerator.getInstance(KEY_ALGORITHM);
            // AES 要求密钥长度为 128
            kg.init(128, new SecureRandom(password.getBytes()));
            // 生成一个密钥
            final SecretKey secretKey = kg.generateKey();
            // 转换为AES专用密钥
            return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);
        }
        catch (final NoSuchAlgorithmException ex) {
            throw new CommonRuntimeException(ex.fillInStackTrace());
        }
    }
 
    public static void main(String[] args) {
        final String str = "V9JofCHn02eyXRiDb1VuseRSuOgEQftROwudMPWwMAO2Wk5K7aYZ4Vtm6xiTn5i5";
        System.out.println(decrypt(str, "xy934yrn9342u0ry4br8cn-9u2"));
    }
 
}

对称加密 AES demo

一、引入pom
<dependency>
    <groupId>cn.licoy</groupId>
    <artifactId>encrypt-body-spring-boot-starter</artifactId>
    <version>1.0.4.RELEASE</version>
</dependency>
二、使用加密注解
//在工程对应的Application类中增加@EnableEncryptBody注解
@EnableEncryptBody
@SpringBootApplication
public class Application {
    
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
三、配置文件

我使用的是yml,properties同理

encrypt:  
    body:
      aes-key: 12345678 #AES加密秘钥,加解密双方保存
四、接口加密
@Controller
@RequestMapping("/test")
public class TestController {

    @GetMapping
    @ResponseBody
    @EncryptBody(value = EncryptBodyMethod.AES)
    public String test(){
        return "hello world";
    }
}
五、控制器入参解密
@RestController
public class TestController {

    @GetMapping
	@AESDecryptBody
    public String test(@RequestBody User user){
        return "hello world";
    }
}

尚未完成,尽情期待~~~