2013-02-13 26 views
2

我正在研究一個帶有mysql後端的PHP應用程序,以用Oracle數據庫替換現有的Oracle Forms應用程序。創建哈希以匹配Oracle DBMS_UTILITY.get_hash_value

我收到了Oracle數據庫的轉儲並將此數據加載到MySQL中。其中一個表包含用戶名和密碼。密碼不是以純文本形式存儲,而是以散列形式存儲。這些哈希已經使用DBMS_UTILITY包中的get_hash_value函數創建。

這個內部Oracle函數使用的算法是什麼?

有誰知道會創建相同散列的PHP(或任何其他語言)函數嗎?

我需要創建沒有Oracle的散列,以便能夠驗證新環境(PHP + MySQL)中的用戶密碼。

回答

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中的匹配,那麼用戶在,否則不。

如果您將後端移動到MySQL,那麼您可能要切換到使用MD5哈希或類似的向前移動。

+0

感謝@tbone的回覆!在設置中,我們使用的所有數據都存儲在MySQL數據庫中,而無需訪問Oralce數據庫。我認爲你的程序需要運行Oracle服務器? – 2013-02-16 10:49:27

+0

@JeroenMoors是的,它確實需要一個Oracle實例,但是由於mysql後端似乎只是一個臨時的情況,爲此我只需在此期間保留一個Oracle服務器。我真的不認爲有一種方法可以在Oracle之外複製get_hash_value。但我很快就會很快遷移到像md5這樣的更通用的散列。 – tbone 2013-02-16 12:19:21

0

我不會試圖找到一種方法來重新創建密碼的單哈希。 現在大多數哈希表都可以在彩虹表中找到,所以如果要保護用戶的憑據,在存儲密碼時使用鹽(最好是個人+系統鹽)已成爲強制性要求。

因此,我不會在嘗試複製散列時花費數小時的工作量,而是重置所有用戶密碼,並讓它們創建一個新的(或相同的)密碼,然後您可以使用php哈希算法正確存儲。我相信用戶會明白,特別是如果你正在重建應用程序。

+0

醃製和散化已經不夠了。您可能不想構建自定義密碼系統。請參閱http://stackoverflow.com/a/401684/409172和http://stackoverflow.com/a/1581919/409172。 – 2013-02-13 19:25:20

+0

在技術層面,我完全同意。不幸的是,我正在建立一個只能在短時間內使用的災難恢復站點。這段時間過後,用戶將回到Oracle應用程序。在中間重置密碼不是一個選項。 – 2013-02-16 10:45:45