Oui :le hachage et le chiffrement (liés mais pas exactement identiques) sont tous effectués via le package SYS DBMS_CRYPTO.
Hachage SHA-1 simple
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_SH1 );
Hachage MD5 simple
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_MD5 );
Présentation de dbms_crypto.hash()
La fonction hash() est surchargée pour accepter les types suivants :RAW, BLOB et CLOB. Selon les conversions de données implicites pour les types d'entrée bruts acceptables sont RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Tous les autres types de données (DATE, TIMESTAMP, etc.) non couverts par la conversion RAW/RAW implicite, BLOB et CLOB devront d'abord être transmis via TO_CHAR().
Il convient de noter que dbms_crypto.hash() prend en charge les algorithmes de hachage suivants :
- HASH_MD4
- HASH_MD5
- HASH_SH1
Mots de passe :au cas où
Si vous stockez des mots de passe, je vous suggère d'utiliser un hachage de stockage de mot de passe (bcrypt, PBKDF2 ou scrypt) au lieu d'un hachage cryptographique (md5, sha-1, etc.). La différence est que les hachages de stockage de mot de passe sont censés prendre du temps à casser tandis que les hachages cryptographiques sont censés être effectués rapidement. Lors de l'attaque de la liste de mots de passe d'un système par force brute, cela prend beaucoup plus de temps lors de la tentative de casser une valeur salée qui est transmise par un algorithme cryptographique. Considérez que l'utilisation d'un hachage de mot de passe sur une seule valeur peut prendre environ 100 ms (pas beaucoup pour une seule connexion authentique), mais très lente pour une force brute (des millions/milliards de tentatives par mot de passe) sur toute votre liste de mots de passe.
Oracle déteste les hachages de mot de passe
Pour ce que ça vaut, je ne connais aucun package d'Oracle qui prend en charge le hachage de mot de passe. Vous pouvez cependant y parvenir en utilisant 'loadjava ' et en mettant une implémentation Java bcrypt dans la JVM qui s'exécute avec le RDBMS d'Oracle. Vous pouvez ensuite utiliser un encapsuleur PL/SQL pour appeler votre classe Java qui implémente bcrypt. Si vous utilisez un niveau intermédiaire, vous pouvez utiliser de nombreuses autres options disponibles dans ce langage (.NET, PHP, Perl, Ruby, Python, Java, etc.) et éviter d'essayer d'utiliser "loadjava".
Je voulais dire chiffrement et non hachage !
Si le hachage dont vous avez besoin n'est pas couvert par dbms_crypto.hash(), vous recherchez peut-être un chiffrement via dbms_crypto.encrypt qui fonctionne de manière très similaire, sauf qu'il prend les types suivants :
- ENCRYPT_DES
- ENCRYPT_3DES_2KEY
- ENCRYPT_3DES
- ENCRYPT_AES
- ENCRYPT_PBE_MD5DES
- ENCRYPT_AES128
- ENCRYPT_AES192
- ENCRYPT_AES256
Voici la documentation complète 11gR2 sur DBMS_CRYPTO . Toutes les autres versions sont disponibles via tahiti.oracle.com . Cliquez simplement sur votre version, puis recherchez "dbms_crypto".