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