【问题标题】:How to use PBKDF2 in Oracle 12c?如何在 Oracle 12c 中使用 PBKDF2?
【发布时间】:2016-01-25 13:40:36
【问题描述】:

我们想在 Oracle 12c 中保存用户密码。我找到了dbms_crypto-Package,但没有关于 PBKDF2 的信息。

2017 年在 Oracle 12c 中使用 PBKDF2 的现状如何?

【问题讨论】:

    标签: oracle oracle12c pbkdf2


    【解决方案1】:

    这是一个迟到的答案,但据我所知,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;
    /
    

    此代码最初在这里找到:PBKDF2 in Oracle;我已经确认它可以在我自己的 SHA-1、SHA-256 和 SHA-512 系统上运行。请注意,p_count 是迭代次数,p_key_length 是密钥的长度。有关 PBKDF2 的推荐迭代次数和推荐密钥长度,请参阅 this question for more information

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      我在My github repository 中有各种 PBKDF2 示例,包括测试向量,如果您绝对坚持在 Oracle 中进行,那么一个纯 SQL Server 实现应该不难转换为 PL/SQL。

      【讨论】:

      • 因为我们使用Oracle APEX,所以应用程序运行在Oracle服务器本身;这就是为什么我在 Oracle 中要求 PBKDF2 :)
      猜你喜欢
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多