如何在不透露的情况下存储IP地址进行比较?

时间:2011-03-02 13:26:32

标签: web ip-address hash privacy

为了打击投票欺诈,我需要在我的数据库中存储IP地址,但我想让它们匿名。我需要的唯一信息是两个地址是否相同......我想。

  • 为防止在公共网站上进行投票操作,是否足以比较IP地址是否相等?

  • 出于透明度/验证目的,我想允许用户下载投票数据。因此,我必须以合适的方式散列IP地址。您建议使用哪种哈希方法?为什么?

6 个答案:

答案 0 :(得分:1)

我过去做了一些功能投票,我使用IP作为唯一约束。缺点是人们可能共享公共IP。

您可以将Cookie和IP结合使用。如果人们作弊与否,这一切都取决于投票的重要性。

我会使用简单的MD5哈希。

答案 1 :(得分:1)

比较公共IP是不够的。您将只允许来自少数国家和企业的一票,这些企业拥有一个外部IP。

最好的方法是使用多种方法来检测虚假投票。

  • 如果用户已登录,则投票与登录相关联,
  • 如果没有设置浏览器cookie。
  • 不要以非常快的速度允许来自同一IP +同一cookie的投票。
  • 如果来自同一IP的投票速度非常快,请使用验证码。

为了匿名化IP,只需制作IP的密钥哈希值。

答案 2 :(得分:0)

  

为了防止在公共网站上进行投票操作,是否足以比较IP地址是否相等?

这将阻止很多在NAT网关后面的人投票,一旦有人在网关后投票。你真的想这样做吗?

答案 3 :(得分:0)

我会对IP地址进行哈希处理,并且对于每个民意调查,请保留已投票人员的哈希列表以及答案列表。不要将答案与哈希相结合。这样,你的哈希究竟有多好也没关系。

你可以考虑除了存储ip,还在客户端放置cookie,例如笔记本电脑用户,连接到不同的网络,从而能够从不同的IP投票。

还要意识到,通过允许ip投票一次,你允许NAT或代理后面的人投票一次。这可能意味着整个公司只能投票一次。你需要考虑这是否可以接受。

答案 4 :(得分:0)

我认为防止投票欺诈的最佳方法是使用身份验证方法。但是你需要一些没有身份验证的公共网站。是吗?

然后你的想法是正确的,IP验证,用一个哈希表将IP地址保存在一个表中。

// Verify in the table if this IP visitor exists

 ...
$ip = $_SERVER['REMOTE_ADDRESS'];

if ($ip == $row['ip']) {

   if (sha1($ip) === '$row[shaip]') {
       echo "You have already give a vote.";
   }
} 
else {

   // Start the process here
   $ip = "$_SERVER['REMOTE_ADDRESS']";
   $shaip = sha1($ip); // the own IP

   // Here inputs IP and HASH in your table
   mysql_query("INSERT ...");

   // Here fetch the data to comparison
   mysql_query("SELECT ...");
}

答案 5 :(得分:0)

使用公共盐进行哈希显然不会使IP保密(其中只有40亿,易于暴力逆转)。

所以你需要保持盐的私密性,此时它基本上成为一个关键。因此,您可以使用像AES这样的对称加密而不是哈希,而不是哈希。而且没有显着差异。除了你自己(拥有密钥的人)更容易扭转加密而不是反转哈希。

您可以做的另一件事是使用明显短于32位的散列。这样就可以防止IP的反转,因为有很多IP匹配单个哈希。但是,当然每次投票都会阻止其他一些IP。如果这是可以接受的取决于你的用例。