2

我正在开发一个带有 mysql 后端的 PHP 应用程序,以用 Oracle 数据库替换现有的 Oracle 表单应用程序。

我收到了 Oracle 数据库的转储,并将这些数据加载到 MySQL。其中一张表包含用户名和密码。密码不是以纯文本形式存储的,而是以散列形式存储的。这些哈希是使用 DBMS_UTILITY 包中的 get_hash_value 函数创建的。

这个内部 Oracle 函数使用的算法是什么?

有谁知道 PHP(或任何其他语言)中会创建相同哈希的函数?

我需要在没有 Oracle 的情况下创建哈希,以便能够在新环境(PHP + MySQL)中验证用户密码。

4

2 回答 2

0

我不会尝试找到一种方法来重新创建密码的单个散列。如今,大多数哈希都可以在彩虹表中找到,因此如果您想保护用户的凭据,则在存储密码时使用盐(最好是个人盐 + 系统盐)已成为强制性的。

因此,与其花费数小时来尝试复制哈希,我只需重置所有用户密码并让他们创建一个新的(或相同的)密码,然后您可以使用 php 哈希算法正确存储该密码。我相信用户会理解的,尤其是如果您无论如何都要重建应用程序。

于 2013-02-13T18:47:08.293 回答
0

我不相信 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 哈希或类似的向前移动。

于 2013-02-13T18:29:15.157 回答