sql >> Database teknologi >  >> RDS >> Oracle

Hvordan bruger man PBKDF2 i Oracle 12c?

Dette er et sent svar, men efter min bedste overbevisning er Oracles DBMS_CRYPTO pakken understøtter ikke PBKDF2 indbygget. Når det er sagt, kan du selv implementere algoritmen; her er en måde at gøre det på:

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

Denne kode blev oprindeligt fundet her:PBKDF2 i Oracle; Jeg har bekræftet, at det virker på mit eget system i SHA-1, SHA-256 og SHA-512. Bemærk, at p_count er antallet af iterationer og p_key_length er nøglens længde. Se dette spørgsmål for at få flere oplysninger om det anbefalede antal iterationer og anbefalet nøglelængde for PBKDF2.

Håber dette hjælper.



  1. kan ikke modtage ud parameter fra oracle procedure udført af mybatis

  2. Hvordan forespørger jeg alle rækker inden for en radius på 5 mil fra mine koordinater?

  3. Sådan tilføjes standardbegrænsning i MySQL

  4. TODATETIMEOFFSET() Eksempler i SQL Server