sql >> Databáze >  >> RDS >> Oracle

Má Oracle nějakou vestavěnou hashovací funkci?

Ano:hašování a šifrování (související, ale ne úplně stejné) se všechny provádějí prostřednictvím balíčku SYS DBMS_CRYPTO.

Jednoduché hašování SHA-1

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

Jednoduché hašování MD5

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

Přehled dbms_crypto.hash()

Funkce hash() je přetížená, aby přijímala následující typy:RAW, BLOB a CLOB. Podle implicitních datových konverzí pro nezpracované přijatelné typy vstupu jsou RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Všechny ostatní datové typy (DATE, TIMESTAMP atd.), na které se nevztahuje konverze RAW/implicitní RAW, BLOB a CLOB, budou muset být nejprve předány pomocí TO_CHAR().

Stojí za zmínku, že dbms_crypto.hash() podporuje následující hashovací algoritmy:

  • HASH_MD4
  • HASH_MD5
  • HASH_SH1

Hesla:pro každý případ

Pokud ukládáte hesla, doporučuji vám použít hash pro ukládání hesel (bcrypt, PBKDF2 nebo scrypt) místo kryptografického hashe (md5, sha-1 atd.). Rozdíl je v tom, že haše pro ukládání hesel mají trvat dlouho, než se prolomí, zatímco kryptografické haše mají být provedeny rychle. Při útoku na seznam hesel systému hrubou silou je to řádově časově náročnější, když se pokouší prolomit nasolenou hodnotu, která prochází kryptografickým algoritmem. Vezměte v úvahu, že použití hash hesla pro jednu hodnotu může trvat ~100 ms (ne mnoho pro jediné autentické přihlášení), ale velmi pomalé pro hrubou sílu (miliony/miliardy pokusů na heslo) přes celý váš seznam hesel.

Oracle nenávidí haše hesel

Nevím o žádných balíčcích od společnosti Oracle, které by poskytovaly podporu hašování hesel. Můžete toho však dosáhnout pomocí 'loadjava a vložení implementace Java bcrypt do JVM, které běží v rámci RDBMS společnosti Oracle. Poté můžete použít PL/SQL wrapper pro volání vaší třídy Java, která implementuje bcrypt. Pokud používáte střední vrstvu, můžete použít mnoho dalších možností, které máte v daném jazyce k dispozici (.NET, PHP, Perl, Ruby, Python, Java atd.) a pokusy o použití 'loadjava' přeskočit.

Měl jsem na mysli šifrování, nikoli hash!

V případě, že hašování, které potřebujete, není pokryto dbms_crypto.hash(), možná budete hledat šifrování pomocí dbms_crypto.encrypt, který funguje velmi podobně, až na to, že zahrnuje následující typy:

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

Zde je úplná dokumentace 11gR2 na DBMS_CRYPTO . Všechny ostatní verze jsou dostupné prostřednictvím tahiti.oracle.com . Stačí kliknout na svou verzi a vyhledat 'dbms_crypto'.




  1. Jsou spouštěče databáze bezpečné pro omezení integrity mezi tabulkami?

  2. Hybridní cloudová replikace pro MySQL pro vysokou dostupnost

  3. Jak mohu odkazovat na tabulku cizích klíčů dvakrát?

  4. MySQL - Jak aplikovat LIMIT na GROUP?