sql >> Databasteknik >  >> RDS >> Oracle

Har Oracle någon inbyggd hashfunktion?

Ja:hash och kryptering (relaterat men inte exakt samma) görs allt via SYS-paketet DBMS_CRYPTO.

Enkel SHA-1-hashning

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

Enkel MD5-hashning

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

Översikt över dbms_crypto.hash()

Funktionen hash() är överbelastad för att acceptera följande typer:RAW, BLOB och CLOB. Enligt implicita datakonverteringar för råa acceptabla indatatyper är RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Alla andra datatyper (DATE, TIMESTAMP, etc.) som inte omfattas av RAW/implicit RAW-konvertering, BLOB och CLOB måste skickas igenom TO_CHAR() först.

Det är värt att notera att dbms_crypto.hash() stöder följande hashalgoritmer:

  • HASH_MD4
  • HASH_MD5
  • HASH_SH1

Lösenord:för säkerhets skull

Om du lagrar lösenord föreslår jag att du använder en hash för lösenordslagring (bcrypt, PBKDF2 eller scrypt) istället för en kryptografisk hash (md5, sha-1, etc). Skillnaden är att hash för lösenordslagring är tänkt att ta tid att bryta medan kryptografiska hash är avsedda att göras snabbt. När man attackerar ett systems lösenordslista med brute force, är det storleksordningar mer tidskrävande när man försöker bryta ett saltat värde som skickas genom en kryptografisk algoritm. Tänk på att det kan ta ~100 ms (inte mycket för en enda autentisk inloggning) att använda en lösenordshash på ett enda värde, men mycket långsamt för en brute force (miljoner/miljarder försök per lösenord) över hela din lösenordslista.

Oracle hatar lösenordshaschar

För vad det är värt är jag inte medveten om några paket från Oracle som tillhandahåller lösenordshashning. Du kan dock åstadkomma detta genom att använda 'loadjava ' och sätta en Java bcrypt-implementering i JVM som körs inom Oracles RDBMS. Du kan sedan använda en PL/SQL-omslag a> att anropa din Java-klass som implementerar bcrypt. Om du använder en mellannivå kan du använda många andra alternativ som är tillgängliga för dig på det språket (.NET, PHP, Perl, Ruby, Python, Java, etc.) och hoppa över att försöka använda 'loadjava'.

Jag menade kryptering inte hash!

Om hashningen du behöver inte täcks av dbms_crypto.hash(), kanske du letar efter kryptering via dbms_crypto.encrypt som fungerar väldigt lika förutom att den tar in följande typer:

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

Här är den fullständiga 11gR2-dokumentationen om DBMS_CRYPTO . Alla andra versioner är tillgängliga via tahiti.oracle.com . Klicka bara på din version och sök sedan efter 'dbms_crypto'.




  1. Hur räknar man förekomster i kommaseparerad kolumn?

  2. Hur man kopierar data från en tabell till en annan i SQL

  3. Php olika tidszoner

  4. PDO Flera frågor:commit och rollback transaktion