Как в Oracle 12.2 добавить bcrypt с использованием внешней процедуры

Как получить хэш пароля, полученный алгоритмом bcrypt с префиксом $2y$, прямо из PL/SQL блока? СУБД Oracle не имеет встроенной поддержки bcrypt. Поэтому, чтобы получить хеш в формате bcrypt, нужно использовать дополнительные внешние процедуры.

Oracle позволяет вызывать внешние процедуры, написанные на C или других языках программирования, которые могут быть скомпилированы в shared libraries (DLLs на Windows или .so файлы на Unix/Linux). Реализовать функцию хеширования можно на любом языке программирования, который поддерживает bcrypt (например, C, Python или Java), и вызывать эту функцию из Oracle как внешнюю процедуру.

Например, один из самых простых и эффективных способов – реализовать генерацию хеша на Java, и затем вызывать этот Java-код из Oracle PL/SQL.

Шаг 1: Подготовка Java-класса для Bcrypt

Для начала нужно написать Java-класс, который использует библиотеку bcrypt для генерации хеша:

import java.security.NoSuchAlgorithmException;
import org.mindrot.jbcrypt.BCrypt;

public class BcryptHashing {
    public static String hashPassword(String password) throws NoSuchAlgorithmException {
        String salt = BCrypt.gensalt(12);
        String hashedPassword = BCrypt.hashpw(password, salt);
        return hashedPassword;
    }
}

Если библиотека bcrypt на сервере не установлена, то её необходимо добавить перед использованием подготовленного класса. Одна из популярных Java-библиотек для работы с bcrypt – jBCrypt. Для этого скачиваем JAR-файл jBCrypt и загружаем его в БД Oracle.

Шаг 2: Загрузка Java-класса и библиотеки в Oracle

Как проверить наличие библиотеки на платформе?

Проверка загруженных Java схем:

Проверить загружены ли необходимые Java-классы и библиотеки в СУБД Oracle можно в представлении ALL_OBJECTS или DBA_OBJECTS (если есть доступ):

SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'JAVA CLASS' AND OBJECT_NAME LIKE '%jBCrypt%';

Просмотр содержимого Java-библиотеки:

Чтобы увидеть, какие классы содержатся в конкретной Java-библиотеке (JAR-файле), загруженной в базу данных, используется представление ALL_JAVA_CLASSES. Это может помочь убедиться, что библиотека jBCrypt была успешно загружена:

SELECT * FROM ALL_JAVA_CLASSES WHERE NAME LIKE '%BCrypt%';

Для загрузки подготовленного класса и необходимых библиотек в базу данных Oracle используется утилита loadjava:

loadjava -u пользователь/пароль@сид -r -v -f -o BcryptHashing.java
loadjava -u пользователь/пароль@сид -r -v -f -o jbcrypt-xxx.jar

пользователь/пароль@сид необходимо заменить на имя пользователя, пароль и SID базы данных. В имени файла jbcrypt-xxx.jar суффикс xxx заменяется на версию библиотеки bcrypt, которая устанавливается.

Шаг 3: Создание PL/SQL функции для вызова Java метода

В СУБД Oracle создаётся функция с вызовом загруженного JAVA-класса:

CREATE OR REPLACE FUNCTION hash_password(p_password VARCHAR2)
RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'BcryptHashing.hashPassword(java.lang.String) return java.lang.String';
/

Шаг 4: Использование функции в PL/SQL

DECLARE
    v_hashed_password VARCHAR2(400);
BEGIN
    v_hashed_password := hash_password('your_password_here');
    DBMS_OUTPUT.PUT_LINE(v_hashed_password);
END;
/
Close Menu