Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Oracle 12c中使用PBKDF2?_Oracle_Oracle12c_Pbkdf2 - Fatal编程技术网

如何在Oracle 12c中使用PBKDF2?

如何在Oracle 12c中使用PBKDF2?,oracle,oracle12c,pbkdf2,Oracle,Oracle12c,Pbkdf2,我们希望在Oracle 12c中保存用户密码。我找到了dbms\u crypto-包,但没有关于PBKDF2的信息 2017年在Oracle 12c中使用PBKDF2的当前状态是什么?您的应用程序服务器应该在进入数据库之前执行PBKDF2-不要在这方面花费宝贵的、有限的Oracle资源 也不要让您的DBA看到明文中的密码,因为如果是Oracle进行哈希运算,他们就必须这样做 我在中有很多PBKDF2示例,包括测试向量,如果您绝对坚持在Oracle中使用它,那么一个纯SQL Server实现应该不

我们希望在Oracle 12c中保存用户密码。我找到了
dbms\u crypto
-包,但没有关于PBKDF2的信息


2017年在Oracle 12c中使用PBKDF2的当前状态是什么?

您的应用程序服务器应该在进入数据库之前执行PBKDF2-不要在这方面花费宝贵的、有限的Oracle资源

也不要让您的DBA看到明文中的密码,因为如果是Oracle进行哈希运算,他们就必须这样做


我在中有很多PBKDF2示例,包括测试向量,如果您绝对坚持在Oracle中使用它,那么一个纯SQL Server实现应该不难转换为PL/SQL。

这是一个迟来的答案,但据我所知,Oracle的
DBMS_CRYPTO
包本机不支持PBKDF2。也就是说,你可以自己实现算法;以下是一种方法:

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;
/
此代码最初在此处找到:;我已经确认它可以在我自己的SHA-1、SHA-256和SHA-512系统上运行。请注意,
p_count
是迭代次数,
p_key_length
是键的长度。有关PBKDF2的建议迭代次数和建议密钥长度,请参阅


希望这有帮助。

因为我们使用Oracle APEX,所以应用程序在Oracle服务器中运行;这就是为什么我要求在Oracle中使用PBKDF2:)