PHP密码的密码功能
PHP中提供了三个可用的加密函数,分别是md5(),sha1()和crc32()。所有函数都采用一个字符串,并输出一个加密的值,并且不能将其反转为原始字符串。实际上,取回原始字符串的唯一方法是运行蛮力算法,该算法试图猜测原始字符串是什么。
为了测试这些功能,我将使用以下字符串。
$string='wibble';
md5()
此函数以32个字符的十六进制数形式返回哈希值。md5()函数已经使用了很多,大多数PHP程序员都会在某个时候遇到它。
md5($string); //返回50eccc6e2b0d307d5e8a40fb296f6171
md5()和sh1()函数具有第二个参数,如果设置为true(默认值为false),则该函数将返回二进制数据。这将返回二进制数据,可以使用bin2hex()函数将其转换为十六进制数。
bin2hex(md5($string,true));
该函数返回与上一个示例相同的结果。
sha1()
sha1()返回sha1哈希作为40个字符长的字符串。该函数比md5()函数更安全,因为猜测原字符串是什么的机会较小。
sha1($string); //返回02e0182ae38f90d11be647e337665e67f9243817
如果第二个可选参数设置为true,也可以使sha1()函数返回二进制数据。
crc32()
这并不是一个真正的加密函数,但是可以以类似的方式使用它,因为字符串总是以相同的结果输出。此函数以整数形式返回字符串的crc32多项式。
crc32($string); //返回489363548
由于PHP存储整数(带符号)的方式,此函数的很多结果都是负数。例如,字符串“wibble”将返回一个正整数,而字符串“wobble”将返回一个负数,必须对此进行补偿。可以通过使用sprintf()函数的“%u”格式化程序来修复此问题,该格式化程序将返回包含正确整数值的字符串。
此哈希函数旨在用作哈希表的一部分,而不用作安全性机制。这是因为很容易生成“哈希冲突”,其中两个单独的字符串具有相同的哈希值。我将其包含在此处是为了给您警告。
sprintf("%u", crc32($string)); //返回489363548
crypt()
该crypt()函数将字符串作为输入,并根据当前系统和环境产生各种不同的输出。盐是第二个参数,如果不包含此参数,该函数将为您生成一个盐,这将导致哈希的结果每次都不相同。需要注意的重要一点是,盐值的值会影响所使用的哈希算法。如果要检测加密算法是否可用,可以使用一组常量。
if ( CRYPT_STD_DES == 1 ) { crypt($string, 'st'); } //返回类似“stNPuLMaoIxdU”的内容"stNPuLMaoIxdU"
如果要比较密码,则必须将整个结果crypt()作为密码的密码传递给salt。例如,以下错误。
$one = crypt('one'); $two = crypt('one'); var_dump($one == $two); //返回假
在第二通crypt()电话中加盐可为我们提供正确的答案。
$one = crypt('one'); $two = crypt('one', $one); var_dump($one == $two); //返回true
与所有散列函数一样,没有解密函数,因为这是一种单向过程。
hash()
该hash()功能是一项多功能功能,默认使用两个参数。第一个是将使用的哈希算法,第二个是要哈希的字符串。要使用漩涡算法对字符串进行编码,请使用以下代码。
hash("whirlpool", $string); //返回91cefc6cc8eecf3a0ef18889bc3b06e7217ce7d41e1d0d5e37709415c3a98e450c53e62ae57680a011a08ef65429e6ba76701c703fcfc4c63938a4aa61737c38
要找出系统支持的哈希算法,可以使用该hash_algos()函数。这将返回可用算法的数组。
print_r(hash_algos());
如果此列表中有haval256,5,那么我建议您使用它,因为它会产生最安全的哈希值。有关哈希函数的更多信息,请参见PHP文档的哈希部分。
破解密码
不可能破坏由sha1编码的字符串的md5,但这只能通过尝试猜测原始值来完成。站点md5.rednoize.com/可以破坏您输入的字符串,但这仅仅是因为它包含4,700万个哈希,因此可以对哈希值进行反向工程。
要阻止这种情况发生在密码中,您可以使用所谓的盐值。与其直接对密码的值进行编码,不如将密码和盐一起存储,而盐则是秘密的。攻击者必须先知道salt值,然后才能正确猜测用户密码。