Java实现AES加密算法工具类

由于现在类似MD5算法可能可以被彩虹桥破解,数据库存储用户密码的时候有需要使用到加密。所以自己根据AES算法的参照网上文章实现了这么一个工具类。

AES算法

AES (Advanced Encryption Standard) 是一种对称密钥加密算法,广泛应用于信息安全领域。它被认为是目前最常用和最安全的加密算法之一。 

介绍

  1. 对称密钥算法:AES 使用相同的密钥进行加密和解密,因此被归类为对称密钥算法。这意味着发送方和接收方必须在通信前共享密钥。

  2. 块加密算法:AES 将明文分成固定大小的块(128 比特),然后对每个块进行加密。在加密过程中,每个块使用相同的密钥独立加密,增强了安全性。

  3. 密钥长度:AES 支持多种密钥长度,包括 128 位、192 位和 256 位。密钥越长,破解难度越大,但同时也增加了计算成本。

  4. 替代算法:AES 有三种变体,分别使用不同的密钥长度,分别为 AES-128、AES-192 和 AES-256。这些变体之间的区别在于密钥长度和轮数。

  5. 加密速度:AES 算法在现代计算机上具有良好的性能,加密速度快,适用于大量数据的加密和解密操作。

优缺点分析

ES算法优点

  1. 安全性高:AES 算法经过广泛的分析和审查,在安全性方面表现良好,被广泛认可为安全可靠的加密算法。

  2. 性能良好:AES 算法在现代计算机和硬件上具有良好的性能,可以快速加密和解密大量数据。

  3. 灵活性:AES 支持不同的密钥长度,可以根据需要选择合适的密钥长度来平衡安全性和性能。

  4. 标准化:AES 是美国政府采用的加密标准,也是国际标准,被广泛应用于各种安全领域。

AES算法缺点

  1. 密钥管理:由于 AES 是对称密钥算法,发送方和接收方需要共享密钥。因此,密钥的安全存储和分发是一个挑战,特别是在大规模系统中。

  2. 中间人攻击:如果未能确保密钥的安全性,可能会受到中间人攻击的威胁,导致数据泄露或篡改。

  3. 硬件资源需求:使用较长的密钥长度(如 256 位)可能会增加加密和解密操作的计算成本,对硬件资源有一定要求。

  4. 不适合公开密钥加密:AES 是对称密钥算法,不适用于公开密钥加密(PKI)体系结构,这在某些场景下可能限制了其应用范围。

综合来看,AES 算法在安全性、性能和灵活性方面表现优异,是许多应用中首选的加密算法之一。然而,在实际应用中,仍需注意密钥管理和安全实施,以确保其有效性。

代码实现

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.spec.KeySpec;
import java.util.Base64;

public class AESEncryptionUtil {


    private static final String AES_ALGORITHM = "AES";

    // 在这里设置用于生成密钥的密码和盐
    private static final String PASSWORD = "myPassword";
    private static final String SALT = "mySalt";

    // 从密码和盐生成AES密钥
    private static final SecretKey secretKey;

    static {
        try {
            secretKey = generateKey(PASSWORD, SALT);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 使用AES加密算法加密提供的密码。
     */
    public static String encrypt(String password) throws Exception {
        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedData = cipher.doFinal(password.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    /**
     * 使用AES解密算法解密提供的加密密码。
     */
    public static String decrypt(String encryptedPassword) throws Exception {
        byte[] decodedData = Base64.getDecoder().decode(encryptedPassword);
        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedData = cipher.doFinal(decodedData);
        return new String(decryptedData, StandardCharsets.UTF_8);
    }

    /**
     * 从密码和盐生成AES密钥。
     */
    private static SecretKey generateKey(String password, String salt) throws Exception {
        // 使用PBKDF2密钥衍生函数生成密钥
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 65536, 256);
        SecretKey tmp = factory.generateSecret(spec);
        return new SecretKeySpec(tmp.getEncoded(), AES_ALGORITHM);
    }

    public static void main(String[] args) throws Exception {
        // 模拟登录过程,解密加密的密码
        String encrypt = encrypt("123");
        System.out.println(encrypt);
        String decryptedPassword = decrypt(encrypt);
        System.out.println("解密后的密码 : " + decryptedPassword);
    }
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 Java 中使用 AES 加密解密的工具类,其中包括了 AES/CBC/PKCS5Padding 算法的加密解密方法: ```java import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; public class AESUtil { private static final String ALGORITHM_AES = "AES"; private static final String CIPHER_AES_CBC_PKCS5PADDING = "AES/CBC/PKCS5Padding"; private static final String IV = "0123456789abcdef"; // 16 位 /** * AES 加密 * * @param data 需要加密的数据 * @param key 密钥字符串(16、24 或 32 位) * @return 加密后的字符串 */ public static String encryptByAES(String data, String key) { try { byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8); SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM_AES); Cipher cipher = Cipher.getInstance(CIPHER_AES_CBC_PKCS5PADDING); IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8)); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] encryptedBytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(encryptedBytes); } catch (Exception e) { e.printStackTrace(); } return null; } /** * AES 解密 * * @param data 需要解密的数据 * @param key 密钥字符串(16、24 或 32 位) * @return 解密后的字符串 */ public static String decryptByAES(String data, String key) { try { byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8); SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM_AES); Cipher cipher = Cipher.getInstance(CIPHER_AES_CBC_PKCS5PADDING); IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8)); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] encryptedBytes = Base64.getDecoder().decode(data); byte[] decryptedBytes = cipher.doFinal(encryptedBytes); return new String(decryptedBytes, StandardCharsets.UTF_8); } catch (Exception e) { e.printStackTrace(); } return null; } } ``` 使用示例: ```java public static void main(String[] args) { String data = "Hello, world!"; String key = "1234567890123456"; String encryptedData = AESUtil.encryptByAES(data, key); System.out.println("加密后的数据:" + encryptedData); String decryptedData = AESUtil.decryptByAES(encryptedData, key); System.out.println("解密后的数据:" + decryptedData); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值