0

我正在编写自己的列表管理器,我需要一个简单的短 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))
4

1 回答 1

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

为了扩展,如果您每次都对同一事物进行异或,则异或不太适合混淆。如果有人得到这些链接的几个例子,他们会得到a ^ n, b ^ n, c ^ n, for a, b, and c,它们是时间(因此,通常只会在最后几位不同)。他们可以计算(a ^ n) ^ (b ^ n)= (a ^ b) ^ (n ^ n)= ,这将只显示和(a ^ b)之间不同的位。如果他们做同样的事情abc并且其中任何一个,他们都会意识到这只是在每种情况下不同的低位。所以他们可以取他们拥有的值,并通过翻转低位开始猜测。对秘密的异或实际上并没有为您购买任何试图猜测值的人的保护;翻转几个低位对于与固定值异或的时间戳和直接针对时间戳一样容易。

为了保证安全,您每次都需要使用不同的值;一次性键盘,您每次都使用不同的、安全的随机数,或者可以安全地从密钥生成新值的函数。在第一种情况下,如果您每次都使用一个新的随机数,为什么不直接使用该数字作为密钥呢?在第二种情况下,您需要使用流密码,它会生成一个伪随机流,您可以使用该流将您的输出与您持有的密钥进行异或运算。但是你需要跟踪你在那个流中的位置;如果你重复这个流,你会遇到同样的老问题,所以这种方法更加复杂和微妙。

您已经在/dev/urandom. 你也可以使用它。只需存储每个订阅者的随机值;每个订阅者只有 4 个字节(如果存储十六进制值,则为 8 个字节)。现在,32 位不是很好的安全性;通过足够的尝试,很有可能有人可以取消订阅其他人。但是,如果您采取任何措施来限制尝试次数,那应该不会太糟糕。而且您总是可以通过为每个链接获取更多字节来轻松提高安全性。

于 2012-12-19T08:50:08.267 回答