Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比md5短的php密码?_Php_Variables_Encryption_Cryptography_Md5 - Fatal编程技术网

比md5短的php密码?

比md5短的php密码?,php,variables,encryption,cryptography,md5,Php,Variables,Encryption,Cryptography,Md5,出于各种愚蠢的原因,我们发布到外部服务器的给定表单变量的最大长度为12个字符 // convert md5 to base64, remove undesirable characters and truncate to $length function tinymd5($str, $length) { // $length 20-22 not advised unless $remove = ''; // remove vowels to prevent undesirable wor

出于各种愚蠢的原因,我们发布到外部服务器的给定表单变量的最大长度为12个字符

// convert md5 to base64, remove undesirable characters and truncate to $length
function tinymd5($str, $length) { // $length 20-22 not advised unless $remove = '';
    // remove vowels to prevent undesirable words and + / which may be problematic
    $remove = array('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U', '+', '/');
    $salt = $str;
    do { // re-salt and loop if rebase removes too many characters
        $salt = $base64 = base64_encode(md5($salt, TRUE));
        $rebase = substr(str_replace($remove, '', $base64), 0, $length);
    } while ($length < 20 && substr($rebase, -1) == '=');
    return str_pad($rebase, min($length, 22), '='); // 22 is max possible length
}

$str = 'Lorem ipsum dolor sit amet 557726776';
echo '<br />' . md5($str);         // 565a0bf7e0ba474fdaaec57b82e6504a
$x = md5($str, TRUE);
echo '<br />' . base64_encode($x); // VloL9+C6R0/arsV7guZQSg==
echo '<br />' . tinymd5($str, 12); // VlL9C6R0rsV7
echo '<br />' . tinymd5($str, 17); // VlL9C6R0rsV7gZQSg
$x = md5(base64_encode($x), TRUE); // re-salt triggered < 20
echo '<br />' . base64_encode($x); // fmkPW/OQLqp7PTex0nK3NQ==
echo '<br />' . tinymd5($str, 18); // fmkPWQLqp7PTx0nK3N
echo '<br />' . tinymd5($str, 19); // fmkPWQLqp7PTx0nK3NQ
echo '<br />' . tinymd5($str, 20); // fmkPWQLqp7PTx0nK3NQ=
echo '<br />' . tinymd5($str, 22); // fmkPWQLqp7PTx0nK3NQ===
我想用md5来模糊这个值,但显然用12个字符是行不通的。是否有一个密码与一个已经作出的PHP函数,将导致一些12个字符或更少

密码的安全性和完整性在这里并不是特别重要。我最后的办法是写一个函数,将每个字母上下移动一个ascii值x。因此,我们的目标不是让密码学专家看不懂它,而是不以纯文本形式发布它,这样非技术人员查看它时就不会知道它是什么


谢谢你的建议。

如果你只需要一个散列,你仍然可以使用md5散列的前12个字符

substr(md5($yourString), 0, 12);
试试crc32(),也许吧?

这是对的补充

答案建议从md5的32个字符表示中提取前12个字符。因此,将丢失20个字符的信息-这将导致更多可能的冲突

通过采用16个字符表示法(原始形式)的前12个字符,可以减少信息丢失:


这将保留75%的数据,而使用32字符形式仅保留37.5%的数据。

所有答案都建议丢失一些数据(更高的冲突可能性),但使用基本转换似乎是更好的方法: e、 就像这里描述的


您还可以生成任意随机字符串并将其插入数据库,在保存之前检查是否存在该字符串。这将允许您使用短哈希,并确保没有冲突。

我必须将此建议付诸实施,因为我必须假设您控制着发送加密值的脚本

我还必须假设您可以创建许多表单字段,但每个表单字段的长度不能超过12个字符

如果是这样的话,您能不能简单地创建多个表单字段并将md5字符串分散到多个隐藏字段

您可以将md5字符串拆分为8个块,并在一个隐藏的表单字段中提交每个块,然后在另一端将它们连接在一起


只是想一想…

也许这将帮助您生成一个12字符的字符串,您可以在URL中传递该字符串,而不会增加冲突的风险

substr(base_convert(md5($string), 16,32), 0, 12);

这可能对OP没有用处,因为他们正在寻找2路函数,但可能有助于寻找比md5更短的散列。以下是我根据自己的需要提出的建议(感谢您突出显示base64_encode函数)。将md5哈希编码为base(64)并删除任何不需要的base(64)字符。我正在删除元音+和/或将有效基数从64减少到52

注意:如果在c字符后截断基(b)编码的哈希,它将允许b^c唯一哈希。这是否足以避免碰撞?这取决于要散列的项目数(k)。冲突概率大致为(k*k)/(b^c)/2,因此,如果使用下面的函数对k=100万个项目进行散列,并在c=12个字符后截断基本b=52编码,则冲突概率小于1/7.5亿。与在c=12个字符后截断十六进制编码(b=16)散列相比较。碰撞的概率大约是500分之一!只需拒绝截断十六进制编码的散列即可。:)

我要说的是,下面的函数(长度为12)对于1000万个项目(碰撞概率小于750万分之一)来说是相当安全的,但是如果您想更安全,请使用base(64)编码(注释掉$remove数组)和/或截断更少的字符

// convert md5 to base64, remove undesirable characters and truncate to $length
function tinymd5($str, $length) { // $length 20-22 not advised unless $remove = '';
    // remove vowels to prevent undesirable words and + / which may be problematic
    $remove = array('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U', '+', '/');
    $salt = $str;
    do { // re-salt and loop if rebase removes too many characters
        $salt = $base64 = base64_encode(md5($salt, TRUE));
        $rebase = substr(str_replace($remove, '', $base64), 0, $length);
    } while ($length < 20 && substr($rebase, -1) == '=');
    return str_pad($rebase, min($length, 22), '='); // 22 is max possible length
}

$str = 'Lorem ipsum dolor sit amet 557726776';
echo '<br />' . md5($str);         // 565a0bf7e0ba474fdaaec57b82e6504a
$x = md5($str, TRUE);
echo '<br />' . base64_encode($x); // VloL9+C6R0/arsV7guZQSg==
echo '<br />' . tinymd5($str, 12); // VlL9C6R0rsV7
echo '<br />' . tinymd5($str, 17); // VlL9C6R0rsV7gZQSg
$x = md5(base64_encode($x), TRUE); // re-salt triggered < 20
echo '<br />' . base64_encode($x); // fmkPW/OQLqp7PTex0nK3NQ==
echo '<br />' . tinymd5($str, 18); // fmkPWQLqp7PTx0nK3N
echo '<br />' . tinymd5($str, 19); // fmkPWQLqp7PTx0nK3NQ
echo '<br />' . tinymd5($str, 20); // fmkPWQLqp7PTx0nK3NQ=
echo '<br />' . tinymd5($str, 22); // fmkPWQLqp7PTx0nK3NQ===
//将md5转换为base64,删除不需要的字符并截断为$length
函数tinymd5($str,$length){/$length 20-22不建议使用,除非$remove='';
//删除元音,以防止出现可能有问题的不需要的单词和+/
$remove=array('a','e','i','o','u','a','e','i','o','u','+','/');
$salt=$str;
如果rebase删除的字符太多,请执行{//re salt并循环
$salt=$base64=base64_编码(md5($salt,TRUE));
$rebase=substr(str_replace($remove,,$base64),0,$length);
}而($length<20&&substr($rebase,-1)='='”);
返回str_pad($rebase,min($length,22),“=”);//22是可能的最大长度
}
$str='Lorem ipsum dolor sit amet 557726776';
回显“
”。md5($str);//565a0bf7e0ba474fdaaec57b82e6504a $x=md5($str,TRUE); 回显“
”。base64_编码($x);//VloL9+C6R0/arsV7guZQSg== 回显“
”。tinymd5($str,12);//VlL9C6R0rsV7 回显“
”。tinymd5($str,17);//VlL9C6R0rsV7gZQSg $x=md5(base64_编码($x),真);//稀土盐触发<20 回显“
”。base64_编码($x);//fmkPW/OQLqp7PTex0nK3NQ== 回显“
”。tinymd5($str,18);//fmkPWQLqp7PTx0nK3N 回显“
”。tinymd5($str,19);//fmkPWQLqp7PTx0nK3NQ 回显“
”。tinymd5($str,20);//fmkPWQLqp7PTx0nK3NQ= 回显“
”。tinymd5($str,22);//fmkPWQLqp7PTx0nK3NQ===
您可以使用更大的字母表,缩短哈希值,但仍然可以恢复原始值

我实现了它-例如,哈希
ee45187ab28b4814cf03b2b424eb974
变为
7fBKxltZiQd7TFsUkOp26w
-它从32个字符变为22个字符。如果你使用更大的阿尔帕豪赌,它会变得更少。如果使用unicode,甚至可以使用表情符号对哈希进行编码…

$hashlen=4
$cxtrong=TRUE
$sslk=openssl\u random\u pseudo\u字节($hashlen,$cxtrong)
$rand=bin2hex($sslk)

埃科$兰特


您可以通过更改变量$hashlen的值来更改散列长度(以2的倍数表示)

我建议您在某处抛出一个
str_rot13()
调用。更严重的是,如果您需要检索解密版本,那么无论如何都不能使用
md5()
,因为这是一个错误