我正在编写我自己的列表管理器,我需要一个简单的简短URL,供用户“一次单击”取消订阅,例如http://unsubscribe.example.com/50d178fa
50d178fa只是一个时代的六边形,我很容易猜到这一点。一个人可能是恶意的,只要正确地猜出某个时间段的妖术,就可以取消订阅。
所以我在找一些光防护装置。xor看起来很简单。还有其他“少吸”建议使用一个秘密,产生一个“不可猜测的字符串”不超过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))发布于 2012-12-19 08:50:08
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实际上并没有给您提供任何保护,使您不受试图猜测值的人的保护;翻转几个低阶位对于针对固定值的时间戳来说,与直接针对时间戳一样容易。
为了安全起见,每次都需要使用不同的值;一次使用不同的时间垫,每次使用不同的、安全的、随机的数字,或者使用可以安全地从键生成新值的函数。在第一种情况下,如果每次使用一个新的随机数,为什么不直接使用这个数字作为密钥呢?在第二种情况下,您将需要使用流密码,它生成一个伪随机流,您可以使用该流从您持有的秘密密钥xoring输出。但是,您需要跟踪您在该流中的位置;如果您重复该流,您会遇到与您相同的老问题,因此这种方法更加复杂和微妙。
在/dev/urandom中,您已经有了一个好的、易于使用的加密安全的不可猜测的值源。你也可以用这个。只需存储每个订阅服务器的随机值;每个订阅服务器仅存储4个字节(如果存储十六进制值,则为8个字节)。现在,32位并不是很好的安全性;如果尝试足够多,很有可能有人可以取消订阅其他人。但是如果你做了什么限制评级的尝试,那就不应该太糟了。通过为每个链接获取更多的字节,您总是可以轻松地增加安全性。
https://stackoverflow.com/questions/13948487
复制相似问题