Есть ли у Oracle встроенная хеш-функция? - программирование
Подтвердить что ты не робот

Есть ли у Oracle встроенная хеш-функция?

Возможный дубликат:
Есть ли какая-либо хеш-функция в PL/SQL?

У меня есть столбец с типом базы данных NCLOB в Oracle 11g. Мне нужно получить хеш-значение для его содержимого. Как это сделать, используя любую встроенную функцию Oracle или внутри PL/SQL SP в Oracle?

4b9b3361

Ответ 1

Да: хеширование и шифрование (связанное, но не совсем то же самое) выполняются через пакет SYS DBMS_CRYPTO.

Простой SHA-1 Хеширование

l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_SH1 );

Простой хеширование MD5

l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_MD5 );

Обзор dbms_crypto.hash()

Функция hash() перегружена, чтобы принимать следующие типы: RAW, BLOB и CLOB. В соответствии с преобразованием данных импликации для необработанных допустимых типов ввода являются RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Все остальные типы данных (DATE, TIMESTAMP и т.д.), Не охваченные RAW/неявным преобразованием RAW, BLOB и CLOB должны быть сначала переданы через TO_CHAR().

Стоит отметить, что dbms_crypto.hash() поддерживает следующие алгоритмы хеширования:

  • HASH_MD4
  • HASH_MD5
  • HASH_SH1

Пароли: только в случае

Если вы храните пароли, я предлагаю использовать хеш-память для хранения пароля (bcrypt, PBKDF2 или scrypt) вместо криптографического хэша (md5, sha-1 и т.д.). Разница заключается в том, что хэш-память для хранения пароля требует времени для разрыва, в то время как криптографические хэши должны выполняться быстро. При атаке списка системных паролей с помощью грубой силы это на порядок больше времени, когда вы пытаетесь сломать соленое значение, которое передается через криптографический алгоритм. Считайте, что использование хэша паролей на одном значении может занять ~ 100 мс (не так много для одного аутентичного входа в систему), но очень медленно для грубой силы (миллионы/миллиарды попыток за пароль) по всему списку паролей.

Oracle ненавидит хэши паролей

Для чего я не знаю каких-либо пакетов из Oracle, которые предоставляют поддержку хэширования пароля. Однако вы можете выполнить это, используя loadjava и поместив реализацию Java bcrypt в JVM, которая работает с Oracle RDBMS. Затем вы можете использовать упаковку PL/SQL для вызова вашего класса Java, который реализует bcrypt. Если вы используете средний уровень, вы можете использовать многие другие варианты, доступные вам на этом языке (.NET, PHP, Perl, Ruby, Python, Java и т.д.) И пропустить попытку использования "loadjava".

Я имел в виду шифрование не хешей!

Если хеширование, которое вам нужно, не покрывается dbms_crypto.hash(), вы можете искать шифрование через dbms_crypto.encrypt, который работает очень аналогично, за исключением того, что он принимает следующие типы:

  • ENCRYPT_DES
  • ENCRYPT_3DES_2KEY
  • ENCRYPT_3DES
  • ENCRYPT_AES
  • ENCRYPT_PBE_MD5DES
  • ENCRYPT_AES128
  • ENCRYPT_AES192
  • ENCRYPT_AES256

Вот полная документация 11gR2 на DBMS_CRYPTO. Все остальные версии доступны через tahiti.oracle.com. Просто нажмите на свою версию и затем найдите "dbms_crypto".