首页 文章

创建哈希以匹配Oracle DBMS_UTILITY.get_hash_value

提问于
浏览
2

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

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

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

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

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

2 回答

  • 0

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

    因此,我只是重置所有用户密码并让他们创建一个新的(或相同的)密码,然后使用PHP哈希算法正确存储,而不是花费数小时的时间来尝试复制哈希 . 我相信用户会理解,特别是如果你正在重建应用程序 .

  • 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;
    

    当然,检查当前db实现如何创建原始哈希 . 但基本上,如果摘要调用的结果与db中的结果相匹配,那么用户就在,否则为no .

    如果您将后端移动到MySQL,那么您可能希望切换到使用MD5哈希或类似的前进 .

相关问题