【问题标题】:How to create md5 hash as the crypt function generates with a md5 salt using the md5 function, not the crypt function?如何创建 md5 哈希,因为 crypt 函数使用 md5 函数生成 md5 盐,而不是 crypt 函数?
【发布时间】:2011-02-15 06:12:03
【问题描述】:

我更喜欢在 php 中使用 crypt 函数来进行密码加密和其他单向加密要求。因为我可以使用任何支持的加密算法,通过更改盐并没有其他优势。通常,我不使用任何盐,它需要随机的 MD5 盐。我将此加密字符串作为密码哈希保存在数据库中,并在验证用户身份时,将其用作 crypt 函数的盐。它在 php 中运行良好。但是当需要任何其他编程语言来创建哈希时,当我在函数的 php 部分使用 crypt 函数时,我们遇到了问题。

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

【问题讨论】:

    标签: php encryption md5 salt crypt


    【解决方案1】:

    这是实现相同功能的code in Java。这可以帮助您在其他语言中做同样的事情。

    对于 PHP,您可能需要查看以下代码:

        echo 'MD5:          ' . crypt('mypassword', '$1$somesalt$') . "\n";
        echo 'MD5:          ' . mycrypt('mypassword', 'somesalt') . "\n";
    
        function to64($s, $n)
        {
            $i64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
            $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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-01
      • 2011-05-05
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      相关资源
      最近更新 更多