Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 非常简单的epoch加密_Shell_Hash_Xor - Fatal编程技术网

Shell 非常简单的epoch加密

Shell 非常简单的epoch加密,shell,hash,xor,Shell,Hash,Xor,我正在写我自己的列表管理器,我需要一个简单的短URL供用户“一键”取消订阅,例如 50d178fa只是一个十六进制的纪元,这太容易猜测了。有人可能是恶意的,只是在一定时间段内通过正确猜测十六进制来取消订阅 所以我在找一些光线保护异或似乎最简单。是否有任何其他使用秘密的“无意义”建议,该秘密会生成一个长度不超过8个字符的“无意义字符串”,而我可能会丢失该字符串 epoch=$(date +%s) hex=$(printf '%x' $epoch) echo Convert

我正在写我自己的列表管理器,我需要一个简单的短URL供用户“一键”取消订阅,例如

50d178fa
只是一个十六进制的纪元,这太容易猜测了。有人可能是恶意的,只是在一定时间段内通过正确猜测十六进制来取消订阅

所以我在找一些光线保护<代码>异或似乎最简单。是否有任何其他使用秘密的“无意义”建议,该秘密会生成一个长度不超过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))
扩展一下,如果每次都对同一事物执行xor,那么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/uradom
中,您已经有了一个好的、易于使用的加密安全不可用值源。你最好用这个。只需存储每个用户的随机值;每个订阅服务器只有4个字节(如果存储十六进制值,则为8个字节)。现在,32位不是很安全;有足够的尝试,有一个很好的机会,有人可以取消订阅其他人。但是,如果你做了任何事情来限制尝试次数,那应该不会太糟糕。而且,只要为每个链接获取更多字节,就可以轻松提高安全性。

因为我已经记录了订阅用户列表的时间,所以我想利用这个“id”。不过,从某种意义上说,你是对的,我可以像你优雅地指出的那样给他们随机ID。@hendry试图回答,但它不适合评论,所以更新了我的答案。谢谢Brian,这是一个难以置信的答案。从那以后,我唯一的另一个想法是,也许我应该带上订户电子邮件的编码版本。这不应该是可以猜测的。我想它会更长(不知道如何编码),但希望它对大多数人来说是一个更好、更明显的API。@hendry当然,你们可以使用电子邮件的编码形式,若你们用一个强密钥加密它,或者你们可以使用一个或类似的东西,但这已经开始变得相当复杂了。记得;您只需要一个唯一的字符串,您可以使用它来查找订户记录,这是不容易猜测的。在每个记录中存储一个随机数,并使用它是非常简单的。我不需要加密电子邮件。除非我担心我是在公开用户的电子邮件。电子邮件本身是一个足够好的秘密,恶意攻击者不会知道我的订户电子邮件,如果运气好的话。是使用此问题的开源项目。
head -c 4 /dev/urandom | xxd -p