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 上获取。