1. Обзор
В реальной жизни мы сталкиваемся с несколькими ситуациями, когда нам необходимо шифрование и дешифрование в целях безопасности. Мы можем легко добиться этого, используя секретный ключ. Поэтому для шифрования и расшифровки секретного ключа нам нужно знать способ преобразования секретных ключей в строку и наоборот. В этом руководстве мы увидим секретный ключ и преобразование строк в Java.
Кроме того, мы рассмотрим различные способы создания секретного ключа в Java с примерами.
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
в массив байтов .
Затем мы преобразуем массив байтов в
строку
, используя кодировку Base64
:
public static String convertSecretKeyToString(SecretKey secretKey) throws NoSuchAlgorithmException {
byte[] rawData = secretKey.getEncoded();
String encodedKey = Base64.getEncoder().encodeToString(rawData);
return encodedKey;
}
3.2. Строка
для SecretKey
Мы преобразуем закодированный ключ String
в массив байтов
, используя декодирование Base64 .
Затем, используя 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("ForEach@2021", "@$#forEacH@#^$*");
String encodedString = ConversionClassUtil.convertSecretKeyToString(encodedKey);
SecretKey decodeKey = ConversionClassUtil.convertStringToSecretKeyto(encodedString);
Assertions.assertEquals(encodedKey, decodeKey);
4. Вывод
Таким образом, мы узнали, как преобразовать SecretKey
в String
и наоборот в Java. Кроме того, мы обсудили различные способы создания SecretKey в
Java.
Как всегда, полный исходный код статьи доступен на GitHub .