Перейти к основному содержимому

Секретный ключ и преобразование строк в Java

· 3 мин. чтения

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 .