gpt4 book ai didi

php - 如何使用 md5 函数而不是 crypt 函数创建 md5 散列,因为 crypt 函数使用 md5 salt 生成?

转载 作者:行者123 更新时间:2023-12-02 05:11:56 27 4
gpt4 key购买 nike

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

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

最佳答案

这里是实现相同功能的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;
}

关于php - 如何使用 md5 函数而不是 crypt 函数创建 md5 散列,因为 crypt 函数使用 md5 salt 生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5000448/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com