哪个位比IP地址中的其他位更重要?

时间:2013-11-11 13:15:36

标签: hash ip bit ipv4

我的服务不应该收集用户访问IP地址来识别用户,这在我的国家是非法的。对于服务器受到攻击的情况,存储的数据必须无法解密。所以,我应该破坏一些IP地址。

我认为腐败一些IP地址会让我不违反法律,并提供良好的防御强彩桌。

但我想尽可能保持IP地址的唯一性。

哪个位比IP地址中的其他位更重要? (32位)

1 个答案:

答案 0 :(得分:1)

首先关于IP地址结构:

IP地址按前缀聚合。拿我自己的IPv4地址37.77.56.75。在此示例中,ISP具有块37.77.56.0/21,这意味着前缀为21位长,并且ISP可以使用最后一个(32-21 =)11位。 ISP委托给我前缀37.77.56.64/27,这使我(32 - 27 =)5位使用。我把整个前缀放在家庭网络的局域网中。然后我选择为我的PC使用位01011,在此前缀中提供IPv4地址37.77.56.75

对于IPv6,结构是相同的。地址长度只有128位,以十六进制记录(与二进制结构和前缀长度相匹配,比IPv4的十进制表示法好得多)。对于IPv6,此示例中的地址为:

ISP有 代表们2a00:8640::/32 我放了2a00:8640:0001::/48给我 我的家庭局域网上2a00:8640:0001:0000::/64,我的电脑有地址 2a00:8640:0001:0000:3528:2df9:b368:e9e9

通常你不会在IPv6地址中写下所有前导零,但为了清楚起见我将它们包括在内。

你可能需要什么:

如果我正确理解您的问题,您希望保持每个地址的唯一性,但这样就无法恢复原始地址。这样做的方法是使用散列算法。确保始终以与二进制字符串相同的方式输入地址,或者如果使用可打印字符串,请确保始终使用规范表示。你可以使用inet_pton / inet_ntop。这是Python中的一个例子:

import md5
import socket 

bad_v4 = '010.001.002.003'            
binary_v4 = socket.inet_pton(socket.AF_INET, bad_v4)                   
canonical_v4 = socket.inet_ntop(socket.AF_INET, binary_v4)              
hash_v4 = md5.md5(canonical_v4).hexdigest()       

print 'Bad IPv4:', bad_v4            
print 'Good IPv4:', canonical_v4       
print 'MD5 digest (in hex):', hash_v4

print ''

bad_v6 = '2A00:8640:001:0:0:0:aB0:cDeF'            
binary_v6 = socket.inet_pton(socket.AF_INET6, bad_v6)                   
canonical_v6 = socket.inet_ntop(socket.AF_INET6, binary_v6)              
hash_v6 = md5.md5(canonical_v6).hexdigest()       

print 'Bad IPv6:', bad_v6            
print 'Good IPv6:', canonical_v6       
print 'MD5 digest (in hex):', hash_v6

这将为您提供此输出:

Bad IPv4: 010.001.002.003
Good IPv4: 10.1.2.3
MD5 digest (in hex): 447d3c6954efb460e6f47e331615176f

Bad IPv6: 2A00:8640:001:0:0:0:aB0:cDeF
Good IPv6: 2a00:8640:1::ab0:cdef
MD5 digest (in hex): b3d5aa35466b0564044ecfb6f558615c

然后使用哈希作为标识符而不是地址。