2011-05-10 653 views
1

我正在使用hmac sha1签署传递给第三方服务的用户标识。 所有用户都使用同一个秘密,而salt对每个用户都是唯一的。hmac密钥和盐的长度

token = userid : timestamp+2hours : hmac(userid : timestamp+2hours, salt+secret) 
token_hex = hex(hash) 

将HMAC短串的工作? userid:timestamp可以是例如12:1304985212 盐和秘密事务的顺序吗? (盐+秘密vs秘密+盐) 共享秘密长度应该是多少?盐的长度应该是多少? 我可以使用相同的密码在服务器和远程服务之间签名消息,还是生成单独的密码更好?

感谢

回答

1

您应该计算HMAC(盐:用户名:时间戳+2小时,秘密)和发送盐:用户名:时间戳+2小时:哈希。 这里盐的目的是使明文更长,而不是重复,因此最好将其附加到明文上,而不是秘密。

如果你真的想改变秘密,做hmac(userid:timestamp + 2hours,hash(salt:secret)),它会让一次秘密看起来更像随机数。

+0

将盐添加到明文部分是有意义的。如果我在服务器和远程服务之间传输salt或将它传递给离线服务器(如秘密),这有什么关系?这个秘密有可能被破解吗?你的第二个例子保护,但也许你的意思是:hmac(salt:userid:timestamp,hash(salt:secret))。在这种情况下,我是否真的需要hmac,还是有足够的sha1(userid:timestamp:salt:secret)? – pablo 2011-05-10 14:06:01

+0

你不能以有用的方式离线传递盐:salt必须是随机的并且只能使用一次,并随着每条消息而变化。所以你只能在使用之前从随机数生成器中获取并使用数据进行传输。盐在每次变化之前都没有什么秘密。实际上,如果你每秒只发送一条消息,你根本不需要单独使用salt:hash(timestamp)就足够了。秘密不能从HMAC结果中提取出来,你唯一的风险就是从服务器上被盗取。第二个例子通过每次给予新的秘密使得HMAC不重复,而不是新的明文。 – blaze 2011-05-11 10:24:33

+0

使用时间戳而不是哈希(时间戳)作为salt和usersecret + globalsecret来防止彩虹攻击有什么问题? – pablo 2011-05-11 19:43:31