Как получить хэш пароля, полученный алгоритмом 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;
/
