我正在创建一个json webservice(C#,WCF),我需要识别一个用户。没有会话管理,因此用户需要为每个命令发送一个标识字符串。我提出的解决方案是AES加密用户的凭据和字符串“过期”(当前为1000毫秒)的时间,然后在发送之前使用Base64对其进行编码(HttpServerUtility.UrlTokenEncode)(通过URL或其他方式)。
我的问题是这样:编码的字符串几乎总是看起来一样,只有很少的变化(我假设这是到期的分钟和秒),因为凭证日期和时间很少变化。虽然字符串可以只使用一次(最后收到的字符串被记录,第二个到最后一个字符串可能已经过期),我仍然认为拦截和阻止GET请求很容易,然后捏造一些东西然后重新发送它。当攻击自动化时,即使超时也可能不起作用。
因此。如何为AES编码的Base64字符串引入附加(可逆)熵?
答案 0 :(得分:3)
更好的方法是使用服务器端会话来保存信息。客户端上的cookie将是临时验证的各种GUID。在服务器端,它将与其用户名相关联。这也可以在服务器端到期,以防止它在路上重复使用。
这将允许用随机字符串对用户进行身份验证,而无需不断地传输其用户名和密码。使用Rainbow表,可以很容易地反转哈希密码和其他东西。
在加密之前向加密字符串添加SALT也会有所帮助。我建议你在最后添加至少15个额外的随机字符。如果您选择走这条路线,这将使暴力行为变得更加困难。
答案 1 :(得分:1)
将熵添加到AES / CBC加密数据的方法是使用随机IV,并将该IV(正好16个字节,AES块的大小)添加到密文,然后对其进行64位编码。我希望您使用CBC而非ECB,因为它可能不安全。