我的服务不应该收集用户访问 IP 地址来识别用户,这在我的国家是非法的。并且存储的数据必须无法解密,以防服务器受到攻击。所以,我应该破坏一些IP地址。
我相信破坏 IP 地址的某些位使我不违反法律,并为强大的彩虹表提供良好的防御。
但是我想尽可能地保持IP地址的唯一性。
IP 地址中哪个位比其他位更重要?(32位)
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
然后使用哈希作为标识符而不是地址。