1. 概述

在现实生活中,我们会遇到多种出于安全目的需要加密和解密的情况。我们可以使用密钥轻松实现这一点。因此,为了加密和解密密钥,我们必须知道将密钥转换为字符串的方法,反之亦然。在本教程中,我们将看到 Java 中的密钥和 字符串 转换。此外,我们还将通过示例介绍在 Java 中创建 Secret Key 的不同方法。

2. 密钥

密钥是用于加密和解密消息的信息或参数。在 Java 中,我们有 SecretKey 一个接口,将其定义为秘密(对称)密钥。此接口的目的是对所有密钥接口进行分组(并为其提供类型安全)。

在 Java 中生成密钥有两种方法:从随机数生成或从给定密码派生。

在第一种方法中,密钥是从加密安全(伪)随机数生成器(如 SecureRandom 类)生成的。

为了生成密钥,我们可以使用 KeyGenerator 类。让我们定义一个生成 SecretKey 的 方法 - 参数 n 指定密钥的长度(128、192 或 256)(以位为单位):

public static SecretKey generateKey(int n) throws NoSuchAlgorithmException {
    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(n);
    SecretKey originalKey = keyGenerator.generateKey();
    return originalKey;
}

在第二种方法中,使用基于密码的密钥派生函数(如 PBKDF2)从给定的密码派生密钥 。我们还需要一个盐值来将密码转换为密钥。盐也是一个随机值。

我们可以将 SecretKeyFactory 类与 PBKDF2WithHmacSHA256 算法结合使用,从给定的密码生成密钥。

让我们定义一个方法,用于根据给定密码生成 SecretKey ,迭代次数为 65,536 次,密钥长度为 256 位:

public static SecretKey getKeyFromPassword(String password, String salt)
  throws NoSuchAlgorithmException, InvalidKeySpecException {
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
    KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 65536, 256);
    SecretKey originalKey = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
    return originalKey;
}

3. SecretKey 与字符串转换

3.1. SecretKey字符串

我们将 SecretKey 转换为 字节 数组。然后,我们将使用 Base64 编码将 字节 数组转换为 字符串

public static String convertSecretKeyToString(SecretKey secretKey) throws NoSuchAlgorithmException {
    byte[] rawData = secretKey.getEncoded();
    String encodedKey = Base64.getEncoder().encodeToString(rawData);
    return encodedKey;
}

3.2. 字符串SecretKey

我们将使用 Base64 解码将编码的 String 键转换为 字节 数组。然后,使用 SecretKeySpecs ,我们将 字节 数组转换为 SecretKey

public static SecretKey convertStringToSecretKeyto(String encodedKey) {
    byte[] decodedKey = Base64.getDecoder().decode(encodedKey);
    SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
    return originalKey;
}

让我们快速验证一下转换:

SecretKey encodedKey = ConversionClassUtil.getKeyFromPassword("Baeldung@2021", "@$#baelDunG@#^$*");
String encodedString = ConversionClassUtil.convertSecretKeyToString(encodedKey);
SecretKey decodeKey = ConversionClassUtil.convertStringToSecretKeyto(encodedString);
Assertions.assertEquals(encodedKey, decodeKey);

4。结论

总之,我们学习了如何在 Java 中将 SecretKey 转换为 String ,反之亦然。此外,我们还讨论了 在 Java 中创建 SecretKey 的各种方法。

与往常一样,本文的完整源代码可以在 GitHub 上获取。