PHP从IPADDRESS生成唯一的哈希

时间:2012-10-29 09:03:13

标签: php hash ip ip-address

我有一个董事会,我想禁用注册,而我希望用户能够使用基于IP地址的唯一ID自由发布

例如:

如果“Joe”IP为200.100.15.117,“Joe”昵称将成为200.100.15.117的哈希函数

如果“Joe”IP更改,他将获得另一个ID,这无关紧要,我只需要每个IPAddress一个唯一ID

还有两件重要的事情:

  • 唯一ID必须为8个字符
  • 哈希应该是安全的,我不希望黑客能够破解我的 用户IPaddresses

我想在使用MD5功能然后将其修剪为8个字符,但这有多独特?有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

您可以将IP地址字符串转换为LONG(4个字节)并随后执行任何操作。

查看php函数ip2long

答案 1 :(得分:1)

这个问题是你不能在同一个网络上区分两个人,所以如果我在那里发帖,我的宿舍邻居去了网站,该网站认为他就是我。

你应该考虑使用cookies,这些可以很容易地变得独一无二,并且AFAIK不能被远程攻击。

对于唯一ID部分,如果要将“用户”存储在数据库中,则只需从“用户”表中分配主键,然后在cookie中使用该键。

如果它的长度为8个字符,则可以在ID前加0 - 例如00000001,00000002 ....这种方式非常独特,而且8个字符长 -

答案 2 :(得分:0)

编辑根据OP对此答案的评论。

下面的代码使用BC Math库将MD5哈希转换为Base-90字符串。这会将32个字符串转换为20个字符串。这远远不是所需的8个字符,但它是使用ASCII范围的最小字符串长度(可以通过使用字符' " \ 将基数增加到Base-94 [space] 但这不会影响字符串长度,而是在处理数据时可能会导致问题。)

$ip      = '200.100.15.117';
$hash    = md5($ip);
$chars16 = array(
    '0' => 0,  '1' => 1,  '2' => 2,  '3' => 3, '4' => 4,  '5' => 5,
    '6' => 6,  '7' => 7,  '8' => 8,  '9' => 9, 'a' => 10, 'b' => 11,
    'c' => 12, 'd' => 13, 'e' => 14, 'f' => 15
);
$base10 = '0';
for ($i = strlen($hash) - 1; $i > 0; $i--) {
    $base10 = bcadd($base10, bcmul($chars16[$hash[$i]], bcpow(16, $i)));
}
$chars   = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,;.:-_+*?!$%&@#~^=/<>[](){}`';
$base    = (string)strlen($chars);
$baseX   = '';
while (bccomp($base10, $base) === 1 || bccomp($base10, $base) === 0) {
    $baseX  = substr($chars, bcmod($base10, $base), 1) . $baseX;
    $base10 = preg_replace('/\.\d*$/', '', bcdiv($base10, $base));
}
$baseX = substr($chars, $base10, 1) . $baseX;
echo $baseX; // Shows: 1BS[JdZf/7J$J{ud&r5i

答案 3 :(得分:0)

你可以对ip地址加盐,例如

$salt = "e45re%$#";
$ip = "200.111.123.111";
$hash = md5($ip.$salt);

$hash = substr($hash,0,8);