Мне нужно создать случайный ключ как из обычного текста, так и из любых параметров (системное время или соль). Возможно ли это на Java и какую комбинацию классов/методов я должен смотреть на это?Создать ключ от простого текста?
ответ
Вы можете посмотреть на классы в javax.crypto
пакете, как
javax.crypto.Cipher;
javax.crypto.KeyGenerator;
javax.crypto.SecretKey;
здесь пример:
public static String generateSymmetricKey() {
KeyGenerator keyGenerator;
try {
keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey key = keyGenerator.generateKey();
Cipher encodeCipher = Cipher.getInstance("AES/CTR/NoPadding");
encodeCipher.init(Cipher.ENCRYPT_MODE, key);
String bigSecret = Base64.getEncoder().encodeToString(
key.getEncoded());
return bigSecret;
} catch (Exception e) {
System.err.println("Secret Key generation failed: "
+ e.getMessage());
throw new RuntimeException(e);
}
}
В результате вы получите в кодировке Base64, зашифрована в соответствии с «AES/CTR/NoPadding ".
Тогда возникает вопрос - вам действительно нужен случайный ключ от «обычного текста», соль, временная метка? Или вам нужно зашифровать свой «обычный текст» ключом и солью?
Что такое «обычный текст» для Random Key?
Обычно существует путь:
- У вас есть значение и ключ
- вы зашифровать значение с ключом
- Чтобы сохранить ваш ключ в тайне вам необходимо зашифровать ключ его-я и Храните его где-то. Пока ключ является байтовым массивом, лучше его закодировать как String для удобства хранения где-нибудь.
- , когда вам нужно расшифровать значение - вы восстанавливаете ключ, а затем используете его для дешифрования своего значения.
Очень спасибо за ваш ответ. У меня есть симметричный алгоритм потока, который я использую для enc/dec поля в БД. но проблема, когда эти данные дублируются в любой области. это выход к одному и тому же шифру. Я использовал функцию generateSymmetricKey(). это очень хорошо, но в случае дублирования он дает разные данные шифрования, но заканчивается тем же самым char – Msama
, где приведен пример данных, где «2020273/2! 1'2! 1! 273» повторяется в 3 ячейках данных, где это идентичные текстовые данные # 3) 240% 2/1! 2,2% 3,2! 3'2! 2% 3,3-120-021'1 "2/1 + 2020273/2! 1'2! 1! 273 % 2 * 2,2 $ 15021123230! 1/1.0.0% 25023 "023/2 + 1'2 & 0020273/2! 1'2! 1! 273 \t $ 3.0.1.3 $ 2 * 2 # 130 + 1 + 022) 1 # 2 $ 3 ' 2 & 3 "2" 21331 # 2 "0020273/2! 1'2! 1! 273 – Msama
Это правильно. Тот же ключ + те же данные, + тот же алгоритм = тот же самый шифр. Но ... существует гораздо больше алгоритмов, чем AES (as например, «PBEwithMD5andDES»), и такие вещи, как IV, соль, счетчик итераций, nonce, padding ... просто проверьте его дальше, и вы можете легко получить не тот же шифр для тех же данных. Тема очень большая. API для всех этих в пакете 'javax.crypto'. Удачи! – Vadim
Google «генерирует случайный ключ с помощью java» и выбирайте его. – DevilsHnd
Как я могу это сделать в java? – Msama
Вам не нужно _java_, чтобы выполнить поиск в Google; просто найдите его в любом современном веб-браузере. –