【问题标题】:How do I introduce entropy to an encoded Base64 string?如何将熵引入编码的 Base64 字符串?
【发布时间】:2012-03-05 01:31:30
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么需要可逆?难道你不能只生成 GUID,将它与你需要的其他信息(用户、时间戳)一起保存到数据库中并将其发送给用户吗?

标签: c# web-services cryptography aes entropy


【解决方案1】:

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

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

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

【讨论】:

  • 我相信,如果你正确使用 salt,即使使用彩虹表,反转散列密码也不是很容易。
  • @svick 这取决于密码的强度,离线情况下的密码强度通常是一个严重的安全问题,计算机太快了
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-10-31
    • 2012-01-19
    • 2021-10-27
    • 2010-09-19
    • 2015-06-04
    • 2022-11-09
    相关资源
    最近更新 更多