如何使用md5函数生成带有md5盐值的md5哈希,而不是使用crypt函数?

3
我更喜欢使用php中的crypt函数进行密码加密和其他单向加密需求。因为我可以使用任何支持的加密算法,通过更改盐值,还有其他几个优点。通常情况下,我不使用任何盐,并且它会采用随机的MD5盐。我将这个加密字符串保存为密码哈希值存储在数据库中,在验证用户时,我将其作为盐值传递给crypt函数。在php中,它运行良好。但是当需要使用其他编程语言创建哈希值时,如果在php函数的crypt部分中使用,我们就会遇到问题。
我想知道是否有一种简单的方法来创建一个MD5哈希值(使用PHP md5()函数或其他函数),该哈希值需要类似于使用MD5盐时crypt函数生成的哈希值。如果我能够理解php中它的工作原理,而不使用crypt函数,那么在其他编程语言中实现它可能有很好的可能性。
1个回答

0

这里是用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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接