2012-03-05 50 views
1

我创建了一个json webservice(C#,WCF),我需要标识一个用户。没有会话管理,因此用户需要为每个命令发送一个标识字符串。我提出的解决方案是AES加密用户的凭证以及字符串'过期'(当前为1000ms)的时间,然后在发送(通过URL或其他方式)之前使用Base64对其进行编码(HttpServerUtility.UrlTokenEncode)。如何将熵引入编码的Base64字符串?

我的问题是这样的:编码的字符串几乎总是看起来一样,只有很少的变化(我认为这将是分钟&秒过期,因为凭证日期和小时很少更改。只能使用一次(最后收到的字符串被记录下来,而倒数第二个可能已经过期),我仍然认为只需拦截并阻止GET请求很容易,然后再重发它。进攻的时候是自动的,甚至超时可能会无法正常工作。

所以。我怎么能引入额外的(可逆的)熵的AES base64编码字符串?

+0

为什么它需要是可逆的?难道你不能只生成GUID,将它与其他需要的信息(用户,时间戳)一起保存到数据库并发送给用户? – svick 2012-03-05 01:38:48

回答

3

执行此操作的更好方法是拥有保存信息的服务器端会话。客户端上的cookie将是临时验证的各种GUID。在服务器端,它将与他们的用户名相关联。这也可以在服务器端过期,以防止它在路上重复使用。

这将允许用户使用随机字符串进行身份验证,而无需不断传输其用户名和密码。使用彩虹表格,很容易反转散列的密码和其他东西。

在加密之前向加密的字符串添加SALT也会有帮助。我会建议你至少添加15个额外的随机字符到最后。如果你选择走这条路线,这将使野蛮人变得更加困难。

+0

如果您正确使用盐,我相信即使使用彩虹表,也不容易反转散列的密码。 – svick 2012-03-05 01:41:48

+0

@svick取决于密码的强度,密码强度在离线情况下是一个严重的安全问题,一般来说,计算机速度太快 – 2012-03-05 03:04:33

1

将熵添加到AES/CBC加密数据的方法是使用随机IV,并将该IV(正好为16个字节,即AES块的大小)预先加密到密文,然后将其编码为64。我希望你在使用CBC而不是ECB,因为它可能不安全。