Да:хеширането и криптирането (свързани, но не съвсем еднакви) се извършват чрез 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 и т.н.). Разликата е, че хешовете за съхранение на пароли са предназначени да отнемат време за разбиване, докато криптографските хешове са предназначени да се правят бързо. Когато атакувате списъка с пароли на системата чрез груба сила, това отнема много повече време, когато се опитва да пробие солирана стойност, която се предава през криптографски алгоритъм. Помислете, че използването на хеш парола за една стойност може да отнеме ~100ms (не много за едно автентично влизане), но много бавно за груба сила (милиони/милиарди опити за парола) за целия ви списък с пароли.
Oracle мрази хешовете на пароли
Колкото и да си струва, не знам за пакети от Oracle, които осигуряват поддръжка за хеширане на пароли. Можете обаче да постигнете това, като използвате 'loadjava ' и поставяне на реализация на Java bcrypt в JVM, която работи с RDBMS на Oracle. След това можете да използвате 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“.