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

Jak používat PBKDF2 v Oracle 12c?

Toto je pozdní odpověď, ale podle mého nejlepšího vědomí DBMS_CRYPTO Oracle balíček nativně nepodporuje PBKDF2. To znamená, že můžete implementovat algoritmus sami; zde je jeden způsob, jak to udělat:

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;
/

Tento kód byl původně nalezen zde:PBKDF2 v Oracle; Potvrdil jsem, že to funguje na mém vlastním systému v SHA-1, SHA-256 a SHA-512. Všimněte si, že p_count je počet iterací a p_key_length je délka klíče. Další informace o doporučeném počtu iterací a doporučené délce klíče pro PBKDF2 naleznete v této otázce.

Doufám, že to pomůže.



  1. Use string obsahuje funkci v dotazu Oracle SQL

  2. Formátovat výsledky SQLite jako JSON

  3. Jak používat SUBSTRING() v MySQL

  4. Sledování změn databáze pomocí ovládání zdroje pracovní složky