首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Oracle12c中使用PBKDF2?

如何在Oracle12c中使用PBKDF2?
EN

Stack Overflow用户
提问于 2016-01-25 21:40:36
回答 2查看 1.8K关注 0票数 4

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

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

EN

回答 2

Stack Overflow用户

发布于 2018-03-23 03:11:49

这是一个较晚的回答,但据我所知,Oracle的DBMS_CRYPTO包本身并不支持PBKDF2。也就是说,您可以自己实现算法;以下是实现算法的一种方法:

代码语言:javascript
复制
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;我已经确认它可以在我自己的系统上运行。请注意,p_count是迭代次数,p_key_length是密钥的长度。有关PBKDF2的推荐迭代次数和推荐密钥长度,请参阅this question for more information

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2016-02-02 14:26:22

您的应用服务器应该在访问数据库之前执行PBKDF2 --不要将宝贵的、有限的Oracle资源浪费在这上面。

而且,也不要让您的DBA看到明文形式的密码,因为如果Oracle是执行散列的那个人,他们就必须这样做!

我有很多用My github repository编写的PBKDF2示例,包括测试向量,如果您坚持使用Oracle语言,还有一个纯粹的SQL Server实现,它应该不难转换为PL/SQL。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34994077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档