题
我试图比较由PHP生成一个由Oracle 10g中产生一个MD5校验和。但是似乎我比较苹果和橘子。
下面就是我所做的测试对比:
//md5 tests
//php md5
print md5('testingthemd5function');
print '<br/><br/>';
//oracle md5
$md5query = "select md5hash('testingthemd5function') from dual";
$stid = oci_parse($conn, $md5query);
if (!$stid) {
$e = oci_error($conn);
print htmlentities($e['message']);
exit;
}
$r = oci_execute($stid, OCI_DEFAULT);
if (!$r) {
$e = oci_error($stid);
echo htmlentities($e['message']);
exit;
}
$row = oci_fetch_row($stid);
print $row[0];
在MD5函数中的Oracle(在上面的查询看到的)使用“dbms_obfuscation_toolkit.md5”包,并且被定义像这样(?):
CREATE OR REPLACE FUNCTION PORTAL.md5hash (v_input_string in varchar2) return varchar2
is
v_checksum varchar2(20);
begin
v_checksum := dbms_obfuscation_toolkit.md5 (input_string => v_input_string);
return v_checksum;
end;
什么出来我的PHP页面是:
29dbb90ea99a397b946518c84f45e016
)Û¹©š9{”eÈOEà
谁能帮我在得到两个匹配?
解决方案
它返回原始字节,你需要将其转换为十六进制。
$x = unpack("H*", $row[0]);
echo $x[1];
其他提示
似乎真实正在从Oracle查询打印的内容是MD5校验的原始字节流,错位的,因为大多数的那些八比特组将不会是ASCII字符。尝试将其转换第一为十六进制。
创建像下面的函数:
create or replace
function md5( input varchar2 ) return sys.dbms_obfuscation_toolkit.varchar2_checksum as
begin
return lower(rawtohex(utl_raw.cast_to_raw(sys.dbms_obfuscation_toolkit.md5( input_string => input ))));
end;
和调用它是这样的:
select md5('foobar') from dual;
似乎“dbms_obfuscation_toolkit.md5”并没有真正恢复以原始格式,因此需要调用“utl_raw.cast_to_raw”。我可能是错的,应该有这更好的解释。
在情况下,你会想在Oracle中的MD5,你可以用这个方法:
select lower(rawtohex(md5hash('foobar'))) from dual
我得到了相同的“数字或值错误”,并发现有两个功能一起工作:
CREATE OR REPLACE FUNCTION MD5RAW( v_input_string in varchar2 )
RETURN varchar2 IS
v_checksum varchar2( 32 );
BEGIN
v_checksum := SYS.DBMS_OBFUSCATION_TOOLKIT.MD5( input_string => v_input_string );
return v_checksum;
END;
CREATE OR REPLACE FUNCTION MD5HEX( v_input_string in varchar2 )
RETURN varchar2 IS
v_hex_value varchar2( 32 );
BEGIN
SELECT LOWER( RAWTOHEX( MD5RAW( v_input_string ) ) )
INTO v_hex_value
FROM dual;
return v_hex_value;
END;
然后你可以运行此查询,让您的校验:
SELECT md5hex( 'my string smoked your hash' ) FROM dual;
这是第二个函数做同样的事情,通过发放对Bazz您所提供的功能提供的SELECT语句,但我宁愿没有做RAWTOHEX - >较低的每个查询的内部转换。这使得太多的东西需要在每次使用查询时可能会出问题。我想这可能是也更快,因为它是在创建时,而不是在运行时编译,但我可能是错了。
不隶属于 StackOverflow