sql >> Database >  >> RDS >> Oracle

Hoe PBKDF2 te gebruiken in Oracle 12c?

Dit is een laat antwoord, maar voor zover ik weet, Oracle's DBMS_CRYPTO pakket biedt geen native ondersteuning voor PBKDF2. Dat gezegd hebbende, kunt u het algoritme zelf implementeren; hier is een manier om het te doen:

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

Deze code is oorspronkelijk hier gevonden:PBKDF2 in Oracle; Ik heb bevestigd dat het werkt op mijn eigen systeem in SHA-1, SHA-256 en SHA-512. Merk op dat p_count is het aantal iteraties en p_key_length is de lengte van de sleutel. Zie deze vraag voor meer informatie over het aanbevolen aantal iteraties en de aanbevolen sleutellengte voor PBKDF2.

Ik hoop dat dit helpt.



  1. hoe meerdere strings samen te vervangen in Oracle

  2. Oracle maakt geen onderscheid tussen nulls en lege strings?

  3. Eerste openbare preview van SQL Server 2019:CTP 2.0

  4. best practices voor mysqldump:deel 1 – MySQL-vereisten