Поддержка Rijndael в Java
У нас есть требование сделать некоторые разработки Rijndael в Java.
любые рекомендации для статей, библиотек и т. д. это нам поможет?
любые указатели на обслуживание хранилища ключей и как безопасно хранить ключи?
Edit:
Он должен быть с открытым исходным кодом. По сути, это просто стандартное шифрование / дешифрование данных с помощью Rijndael.
4 ответов
Java включает AES из коробки. Rijndael-это ня. Вам не нужны никакие внешние библиотеки. Вам просто нужно что-то вроде этого:
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. Это активно поддерживается, высокое качество и имеет хороший набор примеров кода. Для справочной документации вам придется больше полагаться на general JCE docs.
Я не могу сказать, какую библиотеку мы используем для удовлетворения требований сертификации FIPS. Но есть альтернативы CryptoJ, что гораздо дешевле.
В общем, я бы рекомендовал создать новый ключ для каждого сообщения вы шифруете симметричным шифром, таким как Rijndael, а затем шифруете этот ключ асимметричным алгоритмом, таким как RSA. Эти закрытые ключи могут храниться в защищенном паролем программном хранилище ключей, таком как PKCS #12 или Java "JKS", или, для лучшей безопасности, на аппаратном токене "смарт-карты" или другом аппаратном модуле crypto.
как недавно выяснила моя компания, AES не совсем Rijndael. AES имеет ограничение, что ключи должны быть 128, 192 или 256 бит-однако Rijndael допускает ключи, которые также 160 и 224.
Как указано Эриксоном выше, 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
Что касается безопасного хранения ключей, обычным методом является получение ключа шифрования из пользовательского ввода (парольной фразы) с помощью криптографической хэш-функции и использование производного ключа для шифрования связки ключей. Или, если вам нужен только один ключ, вы можете использовать сам производный ключ.
всегда имейте в виду, что безопасность системы напрямую связана с сила используемой хэш-функции. Используйте криптографически безопасную хэш-функцию вместе с солью, если это возможно, и хэш более одного раза (сотни раз, например).
Это, как говорится, вопрос очень расплывчатый.