1

我正在创建一个 json 网络服务(C#、WCF),我需要识别一个用户。没有会话管理,因此用户需要为每个命令发送一个标识字符串。我想出的解决方案是对用户的凭据和字符串“过期”的时间(当前为 1000 毫秒)进行 AES 加密,然后在发送(通过 URL 或其他方式)之前使用 Base64 对其进行编码(HttpServerUtility.UrlTokenEncode)。

我的问题是这样的:编码的字符串几乎总是看起来一样,只有很少的变化(我假设这将是到期的分钟和秒,因为凭证日期和时间很少改变。虽然一个字符串只能使用一次(记录了最后收到的字符串,倒数第二个可能已经过期了),我还是觉得拦截和阻塞GET请求会很容易,捏造一些东西然后重新发送。而当攻击是自动化,即使超时也可能不起作用。

所以。如何向 AES 编码的 Base64 字符串引入额外(可逆)熵?

4

2 回答 2

3

一个更好的方法是拥有一个保存信息的服务器端会话。客户端上的 cookie 将是一种暂时经过身份验证的 GUID。在服务器端,它将与他们的用户名相关联。这也可以在服务器端过期,以防止它在以后被重用。

这将允许用户使用随机字符串进行身份验证,而不必不断地传输他们的用户名和密码。使用 Rainbow 表,很容易反转散列密码和其他内容。

在加密之前向加密字符串添加 SALT 也会有所帮助。我建议您在末尾添加至少 15 个额外的随机字符。如果您选择走那条路线,这将使蛮力变得更加困难。

于 2012-03-05T01:36:35.580 回答
1

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

于 2012-03-05T01:49:41.877 回答