Существует множество собственных библиотек Java для шифрования. Однако они, как правило, не полностью совместимы с OpenSSL, иногда значительно медленнее (см. Показатели на сайте ниже) и не поддерживаются на всех платформах. OpenSSL определенно поддерживается почти на каждой платформе и, как правило, эффективен.
При этом есть некоторые преимущества безопасности при использовании криптографии на основе VM. Это также следует учитывать.
Группа Apache создала библиотеку для Java, которая использует JNI для доступа к openssl для шифрования AES. Я думаю, что это лучший публичный пример использования JNI для доступа к openssl, и вы можете легко ссылаться на него, используя maven.
https://github.com/apache/commons-crypto
Если вы хотите, вы можете извлечь часть привязки JNI из библиотеки и реализовать нужные вам функции.
Этот make-файл показывает, как использовать javah для получения того, что вам нужно от .class для построения кода .c:
https://github.com/apache/commons-crypto/blob/master/Makefile
В частности, эта строка в Makefile вызывает javah: $(JAVAH) -force -classpath $(TARGET)/classes -o $@ org.apache.commons.crypto.cipher.OpenSslNative
для создания правильного файла "OpenSslNative.h" на основе OpenSslNative.class.
https://github.com/apache/commons-crypto/blob/master/src/main/java/org/apache/commons/crypto/cipher/OpenSslNative.java
Обратите внимание, как import java.nio.ByteBuffer;
используется для разрешения выходных буферов C.
Связанная программа .c находится здесь:
https://github.com/apache/commons-crypto/blob/master/src/main/native/org/apache/commons/crypto/cipher/OpenSslNative.c
Он написан с учетом кроссплатформенной поддержки и является хорошим примером. Каждая экспортируемая функция должна начинаться с JNIEXPORT
, и вы можете видеть полный путь к классу в каждом имени функции.
Я видел много плохих привязок JNI, передачу строк и т. Д. Начиная с прочной основы, можно добиться хорошей интеграции OpenSSL в Java.