首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非常简单的时代加密

非常简单的时代加密
EN

Stack Overflow用户
提问于 2012-12-19 08:45:43
回答 1查看 437关注 0票数 0

我正在编写我自己的列表管理器,我需要一个简单的简短URL,供用户“一次单击”取消订阅,例如http://unsubscribe.example.com/50d178fa

50d178fa只是一个时代的六边形,我很容易猜到这一点。一个人可能是恶意的,只要正确地猜出某个时间段的妖术,就可以取消订阅。

所以我在找一些光防护装置。xor看起来很简单。还有其他“少吸”建议使用一个秘密,产生一个“不可猜测的字符串”不超过8个字符,我可能会丢失?

代码语言:javascript
复制
    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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-19 08:50:08

代码语言:javascript
复制
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实际上并没有给您提供任何保护,使您不受试图猜测值的人的保护;翻转几个低阶位对于针对固定值的时间戳来说,与直接针对时间戳一样容易。

为了安全起见,每次都需要使用不同的值;一次使用不同的时间垫,每次使用不同的、安全的、随机的数字,或者使用可以安全地从键生成新值的函数。在第一种情况下,如果每次使用一个新的随机数,为什么不直接使用这个数字作为密钥呢?在第二种情况下,您将需要使用流密码,它生成一个伪随机流,您可以使用该流从您持有的秘密密钥xoring输出。但是,您需要跟踪您在该流中的位置;如果您重复该流,您会遇到与您相同的老问题,因此这种方法更加复杂和微妙。

/dev/urandom中,您已经有了一个好的、易于使用的加密安全的不可猜测的值源。你也可以用这个。只需存储每个订阅服务器的随机值;每个订阅服务器仅存储4个字节(如果存储十六进制值,则为8个字节)。现在,32位并不是很好的安全性;如果尝试足够多,很有可能有人可以取消订阅其他人。但是如果你做了什么限制评级的尝试,那就不应该太糟了。通过为每个链接获取更多的字节,您总是可以轻松地增加安全性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13948487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档