我正在编写自己的列表管理器,我需要一个简单的短网址供用户点击"一次点击"取消订阅,例如http://unsubscribe.example.com/50d178fa
50d178fa
只是一个时代的十六进制,这是我想要思考的猜测。一个人可能是恶意的,只是通过在一段时间内正确猜测十六进制来取消订阅。
所以我正在寻找一些光线保护。 xor
似乎最简单。任何其他"少吸吮"建议使用生成" unguessable字符串的秘密"我可能会丢失不超过8个字符?
epoch=$(date +%s)
hex=$(printf '%x' $epoch)
echo Convert epoch to hex
echo d:$epoch h:$hex
echo h:$hex is ${#hex} characters long
echo Conversion from hex back to epoch
echo h:$hex d:$(printf "%dn" 0x$hex)
n=911 # secret number
obfuscated=$(($epoch ^ $n))
obfuscatedhex=$(printf '%x' $obfuscated)
echo d:$obfuscated, h:$obfuscatedhex is ${#obfuscatedhex} characters long
echo Conversion from hex back to epoch
echo $(($(printf "%dn" 0x$obfuscatedhex) ^ $n))
答案 0 :(得分:2)
head -c 4 /dev/urandom | xxd -p
要扩展,如果你每次都反对同一件事,xor对于混淆不是很好。如果有人获得这些链接的一些示例,他们将获得a ^ n
,b ^ n
,c ^ n
,a
,b
和c
,这是时间(因此,通常只会在最后几位中有所不同)。他们可以计算(a ^ n) ^ (b ^ n)
= (a ^ b) ^ (n ^ n)
= (a ^ b)
,这只会显示a
和b
之间不同的位。如果他们对c
和其中任何一个做同样的事情,他们就会意识到它只是在每种情况下不同的低阶位。因此,他们可以获取他们拥有的值,并通过翻转低位来开始猜测。 xor反对一个秘密实际上并没有给那些试图猜测价值的人提供任何保护;翻转一些低位对于固定值的时间戳来说同样容易,因为它直接与时间戳相对应。
为了确保安全,您每次都需要使用不同的值;一次性填充,每次使用不同的,安全的随机数,或者可以安全地从密钥生成新值的函数。在第一种情况下,如果您每次使用新的随机数,为什么不使用该数字作为密钥呢?在第二种情况下,您需要使用流密码,它会生成一个伪随机流,您可以使用该流来从您保存的密钥中输出输出。但是,您需要跟踪您在该流中的位置;如果你再次重复这个流,你会遇到同样的老问题,所以这种方法更加复杂和精致。
您已在/dev/urandom
中拥有一个易于使用的加密安全不可评估值的良好,易用的来源。你不妨使用它。只需存储每个用户的随机值;每个用户只需4个字节(如果存储十六进制值,则为8个字节)。现在,32位并不是很好的安全性;有足够的尝试,很有可能有人可以取消订阅其他人。但是,如果你做任何限速尝试,它应该不会太糟糕。而且您可以通过为每个链接获取更多字节来轻松提高安全性。