2011-03-31 18 views
5

在PHP中使用md5()函数直接为我提供字符串。在将字符串保存到数据库之前,我想要执行的操作是,除去0(如果该十六进制的字节表示形式为0,并且该字节表示形式为< 0x10),然后将该字符串保存到数据库中。从md5下降0()PHP如果字节表示小于0x10

我该如何在PHP中做到这一点?

MD5 - PHP - 原始值 - catch12 - 214423105677f2375487b4c6880c12ae - 这是我现在得到的。以下是我希望PHP保存在数据库中的值。

MD5 - 原始值 - catch12 - 214423105677f2375487b4c688c12ae

想知道为什么?我在我的Android应用程序中登录和注册的MD5代码没有附加条件为if ((b & 0xFF) < 0x10) hex.append("0");的零作品正常。但是该站点中的忘记密码功能是PHP,即当用户重置密码时发生不匹配。下面的JAVA代码。

byte raw[] = md.digest(); 
StringBuffer hexString = new StringBuffer(); 
for (int i=0; i<raw.length; i++) 
hexString.append(Integer.toHexString(0xFF & raw[i])); 
v_password = hexString.toString(); 

在PHP方面的任何帮助,以便不匹配不会发生将非常有帮助。我无法更改应用程序代码,因为这会对现有用户造成问题。

谢谢。

+4

为什么你要这么做? – yan 2011-03-31 15:50:33

+1

@yan,否则由应用程序和PHP的Java代码生成的MD5将是不匹配的,用户将无法登录。我知道我不应该在应用程序中追加0。 – Aakash 2011-03-31 15:53:50

+2

我真的会尝试修复这个正确的方法。首先,修复Java代码。然后,让PHP将密码散列作为适当的32字节MD5字符串发送。当使用密码进行检查时,如果存储的密码少于32个字符,请根据以下答案之一更改发送的散列PHP。如果散列匹配,则将数据库中的散列更新为适当的32个字符。随着时间的推移,这将更正所有密码哈希值,并且可以将整个事情放在你身后。 – Matthew 2011-03-31 16:28:11

回答

2

将“正常”MD5哈希值传递给此函数。它将解析成单个字节对并去掉前导零。

编辑:修正了一个错字

function convertMD5($md5) 
{ 
    $bytearr = str_split($md5, 2); 
    $ret = ''; 

    foreach ($bytearr as $byte) 
     $ret .= ($byte[0] == '0') ? str_replace('0', '', $byte) : $byte; 

    return $ret; 
} 

或者,如果你不想零字节完全剥离(如果你想为0x00是 '0'),使用这个版本:

function convertMD5($md5) 
{ 
    $bytearr = str_split($md5, 2); 
    $ret = ''; 

    foreach ($bytearr as $byte) 
     $ret .= ($byte[0] == '0') ? $byte[1] : $byte; 

    return $ret; 
} 
+0

@未签名的代码实验我只有当字节<0x10不全为零时,我才需要将0删除。我能在这里做比较吗? – Aakash 2011-03-31 16:03:59

+0

是的,请注意,如果前导数字为零,我们只剥去0。如果第一个数字是零,它必须小于0x10。 – Unsigned 2011-03-31 16:14:07

+0

非常感谢@未签名代码实验室让我试试这个。 – Aakash 2011-03-31 16:15:15

0
$md5 = md5('catch12'); 
$new_md5 = ''; 
for ($i = 0; $i < 32; $i += 2) 
{ 
    if ($md5[$i] != '0') $new_md5 .= $md5[$i]; 
    $new_md5 .= $md5[$i+1]; 
} 

echo $new_md5; 
+0

这将取出字符串中的所有0。 – Aakash 2011-03-31 16:13:36

+0

@Aakash,不,它不会。它只会删除偶数位置上的那些'($ i == 0,2,4,6)'。 – Matthew 2011-03-31 16:15:27

+0

如果遇到零字节(0x00) – Unsigned 2011-03-31 16:17:28

0

要去除前导零(00-> 0,0a->一个,10-> 10)

function stripZeros($md5hex) { 
    $res =''; $t = str_split($md5hex, 2); 
    foreach($t as $pair) $res .= dechex(hexdec($pair)); 
    return $res; 
    } 

要去除前导零&零字节(00->没什么,0a->一,10-> 10)

function stripZeros($md5hex) { 
    $res =''; $t = str_split($md5hex, 2); 
    foreach($t as $pair) { 
    $b = dechex(hexdec($pair)); 
    if ($b!=0) $res .= $b; 
    } 
    return $res; 
    }