2011-02-15 34 views
3

我更喜欢在php中使用crypt函数进行密码加密和其他单向加密要求。因为我可以使用任何支持的加密算法,通过改变盐而没有其他优点。通常,我不使用任何盐,它需要随机的MD5盐。我将这个加密字符串保存为数据库上的密码哈希,并且在对用户进行身份验证时,我将它用作crypt函数的盐。它在php中正常工作。但是当需要其他编程语言来创建散列时,我在函数的php部分中使用crypt函数时,我们遇到了问题。如何使用md5函数创建md5哈希,因为crypt函数使用md5函数生成,而不是crypt函数?

我想知道是否有任何简单的方法来创建一个MD5哈希(使用PHP md5()函数或其他),它需要类似于使用MD5 salt时生成的crypt函数。如果我能理解它如何在php中工作,而不使用crypt函数,那么可能很有可能在其他编程语言中实现。

回答

0

这里的code in Java实现相同的功能。这可能会帮助您在其他语言中执行相同的操作。

对于PHP,你可能想看看这个代码:

echo 'MD5:   ' . crypt('mypassword', '$1$somesalt$') . "\n"; 
    echo 'MD5:   ' . mycrypt('mypassword', 'somesalt') . "\n"; 

    function to64($s, $n) 
    { 
     $i64 = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 
     $r = ''; 
     while (--$n >= 0) { 
      $ss = $s & 0x3f; 
      $r .= $i64[$s & 0x3f]; 
      $s >>= 6; 
     } 
     return $r; 
    } 

    function mycrypt($v, $s) { 
      $m = hash_init("md5"); 
      hash_update($m, $v); 
      hash_update($m, '$1$'); 
      hash_update($m, $s); 

      $m1 = hash_init("md5"); 
      hash_update($m1, $v); 
      hash_update($m1, $s); 
      hash_update($m1, $v); 
      $final = hash_final($m1, true); 
      for ($pl = strlen($v); $pl>0; $pl-=16) { 
        hash_update($m, substr($final, 0, $pl > 16? 16:$pl)); 
      } 
      $final = "\0"; 
      for($i=strlen($v);$i!=0;$i>>=1) { 
        if (($i & 1) != 0) { 
          hash_update($m, $final); 
        } else { 
          hash_update($m, $v[0]); 
        } 
      } 
      $final = hash_final($m, true); 
      for($i=0;$i<1000;$i++) { 
       $m1 = hash_init("md5"); 

       if(($i&1)) { 
        hash_update($m1, $v); 
       } else { 
        hash_update($m1, $final); 
       } 
       if(($i%3)) { 
        hash_update($m1, $s); 
       } 
       if(($i%7)) { 
        hash_update($m1, $v); 
       } 
       if(($i&1)) { 
        hash_update($m1, $final); 
       } else { 
        hash_update($m1, $v); 
       } 
       $final = hash_final($m1, true); 
      } 
      $l = '$1$'.$s.'$'; 
      $l .= to64(ord($final[ 0])<<16 | (ord($final[ 6])<<8) | ord($final[12]), 4); 
      $l .= to64(ord($final[ 1])<<16 | (ord($final[ 7])<<8) | ord($final[13]), 4); 
      $l .= to64(ord($final[ 2])<<16 | (ord($final[ 8])<<8) | ord($final[14]), 4); 
      $l .= to64(ord($final[ 3])<<16 | (ord($final[ 9])<<8) | ord($final[15]), 4); 
      $l .= to64(ord($final[ 4])<<16 | (ord($final[10])<<8) | ord($final[ 5]), 4); 
      $l .= to64(ord($final[11]), 2); 

      return $l; 
    }