2013-02-13 2 views
2

나는 기존 Oracle Forms 애플리케이션을 Oracle 데이터베이스로 대체하기 위해 MySQL 백엔드가있는 PHP 애플리케이션을 개발 중입니다.Oracle DBMS_UTILITY.get_hash_value와 일치하도록 해시 만들기

Oracle 데이터베이스 덤프를 받아서이 데이터를 MySQL에로드했습니다. 테이블 중 하나에 사용자 이름과 암호가 포함되어 있습니다. 암호는 일반 텍스트로 저장되지 않고 해시로 저장됩니다. 이러한 해시는 DBMS_UTILITY 패키지의 get_hash_value 함수로 생성되었습니다.

내부 오라클 기능에서 사용되는 알고리즘은 무엇입니까?

누구든지 PHP (또는 다른 언어)에서 동일한 해시를 작성하는 함수를 알고 있습니까?

새로운 환경 (PHP + MySQL)에서 사용자 암호의 유효성을 검사 할 수 있도록 Oracle없이 해시를 만들어야합니다.

답변

0

구현이 오라클에 의해 자세히 설명되어 있다고 생각하지 않습니다. 하지만 당신은 단순히 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의 결과와 일치하면 사용자는 in이고 그렇지 않은 경우 no입니다.

백엔드를 MySQL로 이동하려면 MD5 해시 또는 이와 유사한 방법으로 전환하고 싶을 것입니다.

+0

답장을 보내 주셔서 감사합니다 @tbone! 우리가 사용하는 설정에서 모든 데이터는 Oralce 데이터베이스에 액세스하지 않고 MySQL 데이터베이스에 저장됩니다. 귀하의 절차에는 Oracle 서버가 실행되어야한다고 생각합니까? –

+0

@JeroenMoors 예, Oracle 인스턴스가 필요하지만, MySQL 백엔드가 임시적인 것으로 보이기 때문에이 시간 동안 Oracle 서버를 유지해야합니다. 나는 오라클 밖에서 get_hash_value를 복제하는 방법이 있다고 생각하지 않는다. 하지만 곧 md5와 같은보다 일반적인 해시로 신속하게 마이그레이션 할 것입니다. – tbone

0

암호에 대해 단일 해싱을 다시 만드는 방법을 찾지 않으려합니다. 오늘날 대부분의 해시는 무지개 테이블에서 찾을 수 있습니다. 따라서 사용자의 자격 증명을 보호하려면 암호를 저장할 때 소금 (바람직하게는 개인 + 시스템 소금)을 사용해야합니다.

그래서 해시를 복사하는 데 많은 시간을 소비하는 대신 모든 사용자 암호를 재설정하고 PHP 해시 알고리즘을 사용하여 올바르게 저장할 수있는 새 (또는 동일한) 암호를 만들면됩니다. 어쨌든 응용 프로그램을 다시 작성하는 경우 특히 사용자가 이해할 것이라고 확신합니다.

+0

소금과 해싱은 더 이상 충분하지 않습니다. 사용자 정의 암호 시스템을 구축하고 싶지는 않을 것입니다. http://stackoverflow.com/a/401684/409172 및 http://stackoverflow.com/a/1581919/409172를 참조하십시오. –

+0

기술 수준에서 나는 완전히 동의합니다. 불행히도 저는 단기간에만 사용되는 재해 복구 사이트를 구축하고 있습니다. 이 기간이 지나면 사용자는 Oracle 응용 프로그램으로 돌아갑니다. 중간에 비밀번호를 재설정하는 것은 옵션이 아닙니다. –