Web 如何存储IP地址以进行比较而不显示它?

Web 如何存储IP地址以进行比较而不显示它?,web,ip-address,hash,privacy,Web,Ip Address,Hash,Privacy,为了打击投票欺诈,我需要在数据库中存储IP地址,但我想让它们匿名。我需要的唯一信息是如果两个地址相同。。。我想 为了防止在公共网站中操纵投票,比较IP地址是否相等就足够了 出于透明/验证的目的,我希望允许用户下载投票数据。因此,我必须以合适的方式散列IP地址。你建议哪种散列方法?为什么 为了防止在公共网站中操纵投票,比较IP地址是否相等就足够了 一旦有人在NAT网关后面投票,这将阻止很多NAT网关后面的人投票。你真的想这么做吗?我过去在功能上做过一些投票,我使用IP作为唯一的约束。缺点是人们

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

  • 为了防止在公共网站中操纵投票,比较IP地址是否相等就足够了

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

为了防止在公共网站中操纵投票,比较IP地址是否相等就足够了


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

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

你可以把cookie和IP结合起来。这完全取决于投票的重要性,若人们作弊或并没有


我会使用一个简单的MD5散列。

我会对IP地址进行散列,并为每次投票保留一个投票人的散列列表和一个答案列表。不要把答案和杂凑在一起。那样的话,你的哈希算法到底有多好都无关紧要

除了存储IP之外,您还可以考虑在客户端上放置cookie,例如,连接到不同网络的人,从而能够从不同IP的投票中投票:


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

< P>比较公共IP是不够的。您只允许少数几个国家和拥有一个外部IP的公司投一票

最好的方法是使用多种方法来检测假选票

  • 如果用户登录,投票与登录绑定
  • 如果未设置浏览器cookie
  • 不允许同一IP+同一cookie以非常快的速度进行投票
  • 如果来自同一IP的投票速度非常快,请输入验证码

对于匿名化IP,只需对IP进行密钥哈希。

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

那么您的想法是对的,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 ...");
}

用公共盐散列显然不能保持IP的私密性(IP只有40亿个,很容易暴力破解)

所以你需要保持盐的私密性,在这一点上它基本上成为一个密钥。因此,您可以使用对称加密(如AES)来代替散列,AES也是一个密钥。而且不会有显著差异。除了对你自己(拥有密钥的人)来说,反转加密比反转散列稍微容易一些

// 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 ...");
}

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

我不是密码专家,但是:IPv4地址只有32位长,因此如果您只对IP地址进行哈希,攻击者就不难将其与每个可能的MD5哈希IP地址进行比较并找出原始地址。据我所知,为此目的,您通常使用随机“salt”,但这样的salt会阻止您比较加密的IP地址以防止重复。(再说一遍,我不是密码专家。)再说一遍,这完全取决于投票的内容。如果是像“你最喜欢的颜色是什么”这样的随机投票,那么IPv4上的MD5就可以了。但是,如果投票真的会影响某些人认为非常重要的事情,那么就需要另一种策略。防止多次投票的Cookies是很容易规避的。我宁愿阻止一些合法的投票,而不是允许许多虚假的投票。