gpt4 book ai didi

oracle - 如何在 Oracle 12c 中使用 PBKDF2?

转载 作者:行者123 更新时间:2023-12-01 13:47:17 24 4
gpt4 key购买 nike

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

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

最佳答案

这是一个迟到的答案,但据我所知 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是 key 的长度。见 this question for more information关于 PBKDF2 的推荐迭代次数和推荐 key 长度。

希望这可以帮助。

关于oracle - 如何在 Oracle 12c 中使用 PBKDF2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34994077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com