2017-02-17 6 views
0

Мне нужно создать случайный ключ как из обычного текста, так и из любых параметров (системное время или соль). Возможно ли это на Java и какую комбинацию классов/методов я должен смотреть на это?Создать ключ от простого текста?

+0

Google «генерирует случайный ключ с помощью java» и выбирайте его. – DevilsHnd

+0

Как я могу это сделать в java? – Msama

+2

Вам не нужно _java_, чтобы выполнить поиск в Google; просто найдите его в любом современном веб-браузере. –

ответ

0

Вы можете посмотреть на классы в 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?

Обычно существует путь:

  1. У вас есть значение и ключ
  2. вы зашифровать значение с ключом
  3. Чтобы сохранить ваш ключ в тайне вам необходимо зашифровать ключ его-я и Храните его где-то. Пока ключ является байтовым массивом, лучше его закодировать как String для удобства хранения где-нибудь.
  4. , когда вам нужно расшифровать значение - вы восстанавливаете ключ, а затем используете его для дешифрования своего значения.
+0

Очень спасибо за ваш ответ. У меня есть симметричный алгоритм потока, который я использую для enc/dec поля в БД. но проблема, когда эти данные дублируются в любой области. это выход к одному и тому же шифру. Я использовал функцию generateSymmetricKey(). это очень хорошо, но в случае дублирования он дает разные данные шифрования, но заканчивается тем же самым char – Msama

+0

, где приведен пример данных, где «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

+0

Это правильно. Тот же ключ + те же данные, + тот же алгоритм = тот же самый шифр. Но ... существует гораздо больше алгоритмов, чем AES (as например, «PBEwithMD5andDES»), и такие вещи, как IV, соль, счетчик итераций, nonce, padding ... просто проверьте его дальше, и вы можете легко получить не тот же шифр для тех же данных. Тема очень большая. API для всех этих в пакете 'javax.crypto'. Удачи! – Vadim