比md5更短的php密码?

tir*_*ing 20 php encryption variables md5 cryptography

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

我想用md5模糊这个值,但很明显有12个字符不起作用.是否有一个已经制作的PHP函数的密码,这将导致12个字符或更少的字符?

密码的安全性和完整性在这里并不是非常重要.我的最后一招是编写一个函数,将每个字母向上或向下移动一个ascii值x.所以我们的目标不是让它从密码学专家那里模糊不清,而只是不以纯文本形式发布它,这样看着它的非技术工作者就不会知道它是什么.

谢谢你的建议.

Nik*_*kiC 17

这是对这个答案的补充.

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

您可以通过获取16个字符表示的前12个字符(原始表单)来减少信息丢失:

substr(md5($string, true), 0, 12);
Run Code Online (Sandbox Code Playgroud)

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

  • 这导致12*字节*,这不一定是12*字符*并且使用非二进制安全函数也是有风险的,遗憾的是这仍然很常见,因为它们会在第一个`\ 0`字符处截断. (3认同)
  • md5($ string,true)`是否不返回不可见字符?我认为这会导致HTML中的问题-哈希可能会被浏览器urlencoded并改变长度... (2认同)

小智 16

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

substr(base_convert(md5($string), 16,32), 0, 12);
Run Code Online (Sandbox Code Playgroud)

  • 这不会保留完整的MD5哈希...根据PHP文档,"警告:base_convert()可能会因为与所使用的内部"double"或"float"类型相关的属性而丢失大数字的精度." 在32位系统上,至少将32位十六进制转换为base-32会导致最后16位数设置为0.尝试:print base_convert(md5('foo'),16,32); 结果为5cnkcdmj62v000000000000000. (3认同)
  • 这应该是公认的答案。它是更紧凑的表示形式的完整 MD5 散列。 (2认同)

Ale*_*sky 9

试试crc32()吧?


Col*_*ert 8

如果您只需要哈希,您仍然可以使用md5哈希中的前12个字符.

substr(md5($yourString), 0, 12);
Run Code Online (Sandbox Code Playgroud)

  • @tiredofcoding:MD5,与任何其他哈希一样,是单向函数:你*不能*解码它.你想要的是一个密码,而不是哈希. (2认同)