我正在开发一个带有 mysql 后端的 PHP 应用程序,以用 Oracle 数据库替换现有的 Oracle Forms 应用程序。
我收到了 Oracle 数据库的转储并将此数据加载到 MySQL 中。其中一个表包含用户名和密码。密码不是以纯文本形式存储,而是以散列形式存储。这些哈希是使用 DBMS_UTILITY 包中的 get_hash_value 函数创建的。
这个内部 Oracle 函数使用的算法是什么?
有人知道 PHP(或任何其他语言)中可以创建相同散列的函数吗?
我需要在没有 Oracle 的情况下创建哈希,以便能够在新环境(PHP + MySQL)中验证用户密码。
最佳答案
我不认为 Oracle 详细说明了实现。但是您不需要在 PHP 中重新创建它,只需围绕它包装一个函数并从 PHP 调用它:
create function digest( p_username in varchar2, p_password in varchar2 ) return varchar2
is
begin
return ltrim( to_char( dbms_utility.get_hash_value( upper(p_username)||'/'||upper(p_password), 1000000000, power(2,30) ), rpad( 'X',29,'X')||'X' ) );
end digest;
-- digest by calling db function
select digest('UserA','MyPassword') from dual;
当然,请检查您当前的数据库实现,了解原始哈希是如何创建的。但基本上,如果摘要调用的结果与数据库中的匹配,则用户在,否则不在。
如果您正在将后端迁移到 MySQL,那么您可能希望切换到使用 MD5 哈希或类似的方式。
关于php - 创建哈希以与 Oracle DBMS_UTILITY.get_hash_value 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14859880/