我们希望在Oracle 12c中保存用户密码。我找到了<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="APPLICATIONROOTDIRECTORY"/>
</Directory>
<SetDirectory Id="APPLICATIONROOTDIRECTORY" Value="[%MY_ENV_VAR]\My\Install\Path" Sequence="first" />
- 包,但没有关于PBKDF2的信息。
2017年在Oracle 12c中使用PBKDF2的现状是什么?
答案 0 :(得分:2)
这是一个迟到的答案,但据我所知,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。
希望这有帮助。
答案 1 :(得分:1)
您的应用程序服务器应该在到达数据库之前执行PBKDF2 - 不要花费宝贵的,有限的Oracle资源。
并且不要让你的DBA看到明文中的密码,因为如果Oracle正在进行散列,他们必须这样做!
我在My github repository中有各种各样的PBKDF2示例,包括测试向量,如果你绝对坚持在Oracle中这样做,那么一个纯粹的SQL Server实现应该不难转换为PL / SQL。