Поддержка Rijndael в Java
У нас есть требование сделать некоторые разработки Rijndael на Java.
Какие-нибудь рекомендации для статей, библиотек и т. Д., Которые могли бы нам помочь?
Есть ли какие-либо указания на обслуживание хранилища ключей и как надежно хранить ключи?
Редактировать:
Это должно быть с открытым исходным кодом. По сути, это просто стандартное шифрование / дешифрование данных с использованием Rijndael.
4 ответа
Java включает AES из коробки. Рейндаэль - это AES. Вам не нужны внешние библиотеки. Вам просто нужно что-то вроде этого:
byte[] sessionKey = null; //Where you get this from is beyond the scope of this post
byte[] iv = null ; //Ditto
byte[] plaintext = null; //Whatever you want to encrypt/decrypt
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//You can use ENCRYPT_MODE or DECRYPT_MODE
cipher.calling init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
byte[] ciphertext = cipher.doFinal(plaintext);
И это все, для шифрования / дешифрования. Если вы обрабатываете большие объемы данных, вам лучше читать фрагменты, кратные 16 байтам, и вызывать update вместо doFinal (вы просто вызываете doFinal в последнем блоке).
Для большой бесплатной библиотеки я настоятельно рекомендую BouncyCastle. Он активно поддерживается, отличается высоким качеством и имеет множество примеров кода. Для получения справочной документации вам придется больше полагаться на общие документы JCE.
Я не могу сказать, какую библиотеку мы используем для соответствия требованиям сертификации FIPS. Но есть альтернативы CryptoJ, которые намного, намного дешевле.
В общем, я бы рекомендовал генерировать новый ключ для каждого сообщения, которое вы шифруете с помощью симметричного шифра, такого как Rijndael, а затем шифровать этот ключ с помощью асимметричного алгоритма, такого как RSA. Эти закрытые ключи могут храниться в защищенном паролем хранилище ключей на основе программного обеспечения, таком как PKCS #12 или Java JKS, или, для большей безопасности, на аппаратном токене "смарт-карты" или другом крипто-аппаратном модуле.
Как недавно узнала моя компания, AES - это не совсем Рейндаэль. AES имеет ограничение, согласно которому ключи ДОЛЖНЫ быть 128, 192 или 256-битными, однако Rijndael также допускает использование ключей 160 и 224.
Как указано выше в erickson, BouncyCastle предоставляет объект Rijndael, который поддерживает дополнительные длины ключей: 128/160/192/224/256 бит. В частности, взгляните на облегченный API.
Gnu-crypto - это еще одна библиотека с открытым исходным кодом, однако она также НЕ обеспечивает поддержку 160- и 224-битных ключей.
Итак, если вы специально ищете полную поддержку Rijndael, то BouncyCastle - единственный, кого я нашел до сих пор.
javax.crypto имеет поддержку AES: http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html
Что касается безопасного хранения ключей, обычным способом является получение ключа шифрования из пользовательского ввода (парольной фразы) с использованием криптографической хеш-функции и использование полученного ключа для шифрования цепочки для ключей. Или, если вам нужен только один ключ, вы можете использовать сам производный ключ.
Всегда имейте в виду, что безопасность системы напрямую связана с силой используемой хэш-функции. Используйте криптографически безопасную хеш-функцию вместе с солью, если это возможно, и хеш-функцию более одного раза (например, сотни раз).
При этом вопрос очень расплывчатый.