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