Вопрос:
Я хотел бы использовать AES256 для шифрования text, я бы хотел использовать свой email [email protected] в качестве key для его шифрования.
Вот что я пробовал:
String key = «[email protected]»; SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(«UTF-8»), «AES»); byte iv[] = SOME_RANDOM_32_BYTES; IvParameterSpec ivSpec = new IvParameterSpec(iv); Cipher cipher = Cipher.getInstance(«AES/CBC/PKCS5Padding»); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); byte[] encryptedResult = cipher.doFinal(text.getBytes(«UTF-8»));
Когда я запускаю код выше, я получил InvalidKeyException:
java.security.InvalidKeyException: Key length not 128/192/256 bits.
Я проверил в Интернете, причина в том, что мой ключ не 128/192/256 бит. Мой вопрос: как я могу сгенерировать 256-битный (32 байта) ключ из моей электронной почты [email protected]?
Ответ №1
Вы можете хэш-строку вашего ключа ([email protected]) до 256-битного значения с помощью SHA256.
MessageDigest md = MessageDigest.getInstance(«SHA-256»); md.update(yourEmail.getBytes()); byte[] encryptionKey = md.digest(); Ответ №2
Для этого может быть несколько причин. Один из них ниже. Обычно эта ошибка возникает, когда в вашей JRE отсутствует политика обновления. Java по умолчанию предоставляет AES с 128, для 256 мы должны вводить новые политики, предоставляемые Java.
Ответ №3
Вы не должны испечь свой крипто! (Если вы не очень хорошо разбираетесь в этом, то есть.)
Вы должны использовать существующую (и проверенную) библиотеку шифрования.
Кроме того, вы не должны использовать допустимую строку, такую как ваш адрес электронной почты, в качестве пароля. Пожалуйста, найдите советы по выбору хорошего пароля.
Теперь, когда я сказал это, вот подробности.
Правильный способ внедрения шифрования на основе пароля – использовать KDF (Key Derivation Function) для генерации ключа шифрования из вашего пароля. Вот несколько KDFs, которые можно использовать для решения этой задачи: Argon 2, Scrypt, Bcrypt и PBKDF2.
К ключевым функциям деривации относятся механизмы защиты от известных атак, таких как радужные таблицы и словарные атаки, в частности “соль” и коэффициент работы. Современные KDF, такие как Argon2, также пытаются помешать злоумышленникам получить преимущество, используя оборудование, более подходящее для задачи.
Вообще говоря, здесь, как это используется:
- Выберите коэффициент работы (самый большой, который вы можете себе позволить)
- Сформировать соль с помощью CSPRNG
- Создайте ключ шифрования и секрет MAC, используя выбранный KDF с паролем, солью и коэффициентом работы.
- Генерировать IV (вектор инициализации) с использованием CSPRNG
- Шифруйте защищенные данные с помощью сгенерированного ключа шифрования.
- Вычислить MAC зашифрованного сообщения, используя сгенерированный секрет.
- Сериализуйте соль, коэффициент работы, вычисленный MAC и зашифрованные данные. (Опционально, идентификаторы, указывающие, какие выбранные KDF, схема шифрования и MAC также должны быть включены, если они не исправлены.)
Ваше зашифрованное сообщение – это сериализованные данные, созданные на шаге 7. Избегайте каких-либо шагов (и это легко), и ваш код шифрования, вероятно, будет разрушен ужасно.
Возможно, теперь вы понимаете, зачем использовать существующую библиотеку?
Примечание. Лучшей практикой является использование AEAD (аутентифицированное шифрование с ассоциированными данными) вместо шифрования-затем-MAC, как описано выше. Посмотрите, если вы заинтересованы: я не собираюсь обсуждать это здесь.