Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để sử dụng PBKDF2 trong Oracle 12c?

Đây là một câu trả lời muộn, nhưng theo hiểu biết của tôi thì DBMS_CRYPTO của Oracle gói không hỗ trợ PBKDF2 nguyên bản. Điều đó nói rằng, bạn có thể tự triển khai thuật toán; đây là một cách để làm điều đó:

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

Mã này ban đầu được tìm thấy ở đây:PBKDF2 trong Oracle; Tôi đã xác nhận rằng nó hoạt động trên hệ thống của riêng tôi trong SHA-1, SHA-256 và SHA-512. Lưu ý rằng p_count là số lần lặp lại và p_key_length là chiều dài của khóa. Xem câu hỏi này để biết thêm thông tin về số lần lặp được khuyến nghị và độ dài khóa được đề xuất cho PBKDF2.

Hy vọng điều này sẽ hữu ích.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-12154 không thể phân giải mã nhận dạng kết nối được chỉ định

  2. Kiểm tra Ràng buộc Gọi hàm Nhà phát triển Oracle SQL

  3. Sử dụng PL / SQL làm cách nào để tôi đưa nội dung của tệp vào một đốm màu?

  4. cách chọn danh sách 10.000 id duy nhất từ ​​kép trong SQL oracle

  5. Tôi có thể sao chép:Bản ghi giả CŨ và:MỚI vào / vào một thủ tục được lưu trữ Oracle không?