Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment utiliser PBKDF2 dans Oracle 12c ?

Il s'agit d'une réponse tardive, mais à ma connaissance, DBMS_CRYPTO d'Oracle Le package ne prend pas en charge PBKDF2 de manière native. Cela dit, vous pouvez implémenter l'algorithme vous-même; voici une façon de le faire :

CREATE OR REPLACE FUNCTION pbkdf2
  ( p_password IN VARCHAR2
  , p_salt IN VARCHAR2
  , p_count IN INTEGER
  , p_key_length IN INTEGER )
RETURN VARCHAR2
IS
    l_block_count INTEGER;
    l_last RAW(32767);
    l_xorsum RAW(32767);
    l_result RAW(32767);
BEGIN
    l_block_count := CEIL(p_key_length / 20);  -- use 20 bytes for SHA1, 32 for SHA256, 64 for SHA512

    FOR i IN 1..l_block_count LOOP
        l_last := UTL_RAW.CONCAT(UTL_RAW.CAST_TO_RAW(p_salt), UTL_RAW.CAST_FROM_BINARY_INTEGER(i, UTL_RAW.BIG_ENDIAN));
        l_xorsum := NULL;

        FOR j IN 1..p_count LOOP
            l_last := DBMS_CRYPTO.MAC(l_last, DBMS_CRYPTO.HMAC_SH1, UTL_RAW.CAST_TO_RAW(p_password));
            -- use HMAC_SH256 for SHA256, HMAC_SH512 for SHA512

            IF l_xorsum IS NULL THEN
                l_xorsum := l_last;
            ELSE
                l_xorsum := UTL_RAW.BIT_XOR(l_xorsum, l_last);
            END IF;
        END LOOP;

        l_result := UTL_RAW.CONCAT(l_result, l_xorsum);
    END LOOP;

    RETURN RAWTOHEX(UTL_RAW.SUBSTR(l_result, 1, p_key_length));
END pbkdf2;
/

Ce code a été trouvé à l'origine ici :PBKDF2 dans Oracle; J'ai confirmé que cela fonctionne sur mon propre système dans SHA-1, SHA-256 et SHA-512. Notez que p_count est le nombre d'itérations et p_key_length est la longueur de la clé. Consultez cette question pour plus d'informations sur le nombre d'itérations recommandé et la longueur de clé recommandée pour PBKDF2.

J'espère que cela vous aidera.