Tak: hashowanie i szyfrowanie (powiązane, ale nie do końca takie same) są wykonywane za pośrednictwem pakietu SYS DBMS_CRYPTO.
prosty SHA-1 Hashing
l_hash := dbms_crypto.hash(l_src, dbms_crypto.HASH_SH1);
prosty MD5 Hashing
l_hash := dbms_crypto.hash(l_src, dbms_crypto.HASH_MD5);
Przegląd dbms_crypto.hash()
Funkcja mieszająca() jest przeciążony akceptować następujące typy: RAW, BLOB, a nd CLOB. Zgodnie z implicity data conversions dla surowych dopuszczalnych typów wejściowych są RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Wszystkie inne typy danych (DATE, TIMESTAMP, itd.) Nieobjęte RAW/niejawną konwersją RAW, BLOB i CLOB muszą być najpierw przekazane przez TO_CHAR().
Warto zauważyć, że dbms_crypto.hash() obsługuje następujące algorytmy mieszaja:
- HASH_MD4
- HASH_MD5
- HASH_SH1
Hasła: na wszelki wypadek
Jeśli przechowujesz hasła, Sugeruję użycie skrótu do przechowywania haseł (bcrypt, PBKDF2 lub scrypt) zamiast skrótu kryptograficznego (md5, sha-1, itp.). Różnica polega na tym, że skróty do przechowywania haseł mają zająć trochę czasu, a skróty kryptograficzne powinny zostać wykonane szybko. Podczas atakowania listy haseł systemowych za pomocą brutalnej siły, jej kolejność jest o wiele większa, gdy próbuje się złamać soloną wartość, która jest przekazywana przez algorytm kryptograficzny. Weź pod uwagę, że użycie skrótu hasła do pojedynczej wartości może zająć około 100ms (niewiele za jeden autentyczny login), ale bardzo powolne w przypadku brutalnej siły (miliony/miliardy prób na hasło) na całej liście haseł.
Oracle Hates hasło wartości mieszania
za to, co warto nie jestem świadom wszelkich opakowań z Oracle, które zapewniają wsparcie hasło mieszającego. Można to jednak osiągnąć, używając "loadjava" i umieszczając implementację bcrypt Java w JVM, która działa z RDBMS Oracle. Następnie możesz użyć PL/SQL wrapper, aby wywołać twoją klasę Java, która implementuje bcrypt. Jeśli używasz warstwy pośredniej, możesz użyć wielu innych opcji dostępnych w tym języku (.NET, PHP, Perl, Ruby, Python, Java itp.) I pomiń próbę użycia "loadjava".
Chodziło mi o szyfrowanie bez skrótów!
W przypadku mieszania trzeba nie są objęte dbms_crypto.hash(), to może być patrząc na szyfrowanie poprzez dbms_crypto.encrypt która działa bardzo podobnie poza tym, że bierze w następujących rodzajach:
- ENCRYPT_DES
- ENCRYPT_3DES_2KEY
- ENCRYPT_3DES
- ENCRYPT_AES
- ENCRYPT_PBE_MD5DES
- ENCRYPT_AES128
- ENCRYPT_AES192
- ENCRYPT_AES256
Oto pełna 11gR2 documentation on DBMS_CRYPTO. Wszystkie pozostałe wersje są dostępne pod numerem tahiti.oracle.com. Po prostu kliknij swoją wersję, a następnie wyszukaj "dbms_crypto".
Zobacz dbms_crypto.hash http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_crypto.htm#ARPLS65700. Nie widzę wersji, która ma NCLOB, nie wiem, jak gdyby 'src IN CLOB CHARACTER SET ANY_CS' mógł wziąć NCLOB bez strat we wszystkich przypadkach. Coś do zbadania. –
To pytanie nie jest * dokładnym * duplikatem. Istnieją pewne subtelne, ale znaczące różnice między hashowaniem NCLOB lub VARCHAR2. W szczególności, mieszanie NCLOB może nie być deterministyczne, jeśli używasz ORA_HASH, więc jedna z odpowiedzi dla drugiego pytania może nie być odpowiednia. Zobacz moją odpowiedź tutaj dla informacji na temat deterministycznego mieszania: http://stackoverflow.com/a/9476696/409172 –