Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak korzystać z PBKDF2 w Oracle 12c?

To spóźniona odpowiedź, ale według mojej najlepszej wiedzy DBMS_CRYPTO Oracle pakiet nie obsługuje natywnie PBKDF2. To powiedziawszy, możesz sam zaimplementować algorytm; oto jeden ze sposobów, aby to zrobić:

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

Ten kod został pierwotnie znaleziony tutaj:PBKDF2 w Oracle; Potwierdziłem, że działa na moim własnym systemie w SHA-1, SHA-256 i SHA-512. Zwróć uwagę, że p_count to liczba iteracji i p_key_length to długość klucza. Zobacz to pytanie, aby uzyskać więcej informacji na temat zalecanej liczby iteracji i zalecanej długości klucza dla PBKDF2.

Mam nadzieję, że to pomoże.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - Jak wybrać wiersz mający kolumnę o maksymalnej wartości

  2. Używanie setDate w PreparedStatement

  3. ORA - 00933 zamieszanie ze sprzężeniem wewnętrznym i as

  4. 2 sposoby na uzyskanie minut z wartości daty i godziny w bazie danych Oracle

  5. Instrukcja UPDATE w Oracle przy użyciu SQL lub PL/SQL do aktualizacji TYLKO pierwszego zduplikowanego wiersza