0

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

我相信破坏 IP 地址的某些位使我不违反法律,并为强大的彩虹表提供良好的防御。

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

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

4

1 回答 1

1

首先介绍一下IP地址结构:

IP 地址按前缀聚合。取我自己的 IPv4 地址37.77.56.75。在这个例子中,ISP 有 block 37.77.56.0/21,这意味着前缀是 21 位长,最后 (32 - 21 =) 11 位可由 ISP 使用。ISP 将 prefix 委托给我37.77.56.64/27,这让我 (32 - 27 =) 5 位可以使用。我将整个前缀放在家庭网络的 LAN 中。然后我选择01011为我的 PC 使用位,在这个前缀中给出 IPv4 address 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

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

于 2013-11-11T14:24:40.727 回答