对纪元来说真的很简单

时间:2012-12-19 08:45:43

标签: shell hash xor

我正在编写自己的列表管理器,我需要一个简单的短网址供用户点击"一次点击"取消订阅,例如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))

1 个答案:

答案 0 :(得分:2)

head -c 4 /dev/urandom | xxd -p

要扩展,如果你每次都反对同一件事,xor对于混淆不是很好。如果有人获得这些链接的一些示例,他们将获得a ^ nb ^ nc ^ nabc ,这是时间(因此,通常只会在最后几位中有所不同)。他们可以计算(a ^ n) ^ (b ^ n) = (a ^ b) ^ (n ^ n) = (a ^ b),这只会显示ab之间不同的位。如果他们对c和其中任何一个做同样的事情,他们就会意识到它只是在每种情况下不同的低阶位。因此,他们可以获取他们拥有的值,并通过翻转低位来开始猜测。 xor反对一个秘密实际上并没有给那些试图猜测价值的人提供任何保护;翻转一些低位对于固定值的时间戳来说同样容易,因为它直接与时间戳相对应。

为了确保安全,您每次都需要使用不同的值;一次性填充,每次使用不同的,安全的随机数,或者可以安全地从密钥生成新值的函数。在第一种情况下,如果您每次使用新的随机数,为什么不使用该数字作为密钥呢?在第二种情况下,您需要使用流密码,它会生成一个伪随机流,您可以使用该流来从您保存的密钥中输出输出。但是,您需要跟踪您在该流中的位置;如果你再次重复这个流,你会遇到同样的老问题,所以这种方法更加复杂和精致。

您已在/dev/urandom中拥有一个易于使用的加密安全不可评估值的良好,易用的来源。你不妨使用它。只需存储每个用户的随机值;每个用户只需4个字节(如果存储十六进制值,则为8个字节)。现在,32位并不是很好的安全性;有足够的尝试,很有可能有人可以取消订阅其他人。但是,如果你做任何限速尝试,它应该不会太糟糕。而且您可以通过为每个链接获取更多字节来轻松提高安全性。