泄露 AES 加密密码是否安全?

信息安全 加密 AES
2021-08-30 17:29:06

如果我的任何陈述不正确,请纠正我。

不显示任何密码提示可能是更好的做法。

但是,AES 加密密码本身不能用于解密密码或找到密钥;已知明文攻击不适用于 AES。这意味着泄露加密密码并不会真正伤害任何东西。

那么,在 Web 应用程序中泄露 AES 加密密码是否安全?

2个回答

主要答案

总之,您的第一个假设是完全正确的:

不显示任何密码提示可能是更好的做法。

不过,您的其余问题存在一些问题:

  • 您不想加密密码。

    通常,至少是这样。

    施罗德在评论中正确地问

    附带问题:为什么密码是加密的而不是散列的?

    问题是:如果您加密密码而不是散列密码,您始终可以解密并使用它们。通常,解密密钥必须位于应用程序中的某个位置,才能使数据有任何用途。

    因此,如果有人窃取了您的应用程序的数据——这种情况并不少见(以及在haveibeenpwned上显示凭据的通常原因)——那么某人的所有密码都是明文形式的。

    因此,您通常希望对密码进行哈希处理——这里有很多关于其工作原理的问答。

  • 您不想使用纯 AES

    如果您使用纯 AES,则相同的密码将加密为相同的密文。

    如果有人可以访问所有密文,统计分析很可能会泄露至少一个密文的明文——并且所有使用该密码的帐户都会被自动破解。

    一个例子:如果你知道最常用的密码是cucumber,你继续寻找最常出现的密文——明文很可能是cucumber

    此外,这会将您的用户密码限制为块大小。这可能不是您(或您的用户)想要的。

  • 您确实希望尽可能少地提供信息。

    即使公开列出用户密码的正确哈希值也是一个非常糟糕的主意,因为 - 再次 - schroeder 已经在评论中提出:

    另一个问题:“安全”是什么意思?可以暴力破解加密字符串。

  • 根据纯文本犯罪者的常见问题解答,加密密码基本上是一种纯文本犯罪

    1. 但是该网站说他们使用 [something] 安全地存储了我的密码!

      你的密码是你的。这是您在网站上识别自己的方式。如果网站在您将密码提供给他们后可以告诉您密码是什么,那么任何人都可以知道您的密码是什么(黑客、心怀不满的员工、偶然发现密码的人等)。

边注

虽然具有合理操作模式的 AES 不易受到已知的明文攻击(我认为您的想法是“我知道我的密码,我可以推断密钥并知道所有密码”),但使用纯 AES 将如前所述,增加攻击者在CPA模型中获胜的机会

鉴于用户可以更改他/她的密码,这基本上就是您所拥有的。

不它不是。

虽然加密的目的是保护加密中的数据(前提是密钥是安全的!),但存在一个非常明显的漏洞,特别是密码很容易受到以下攻击:

使用 AES 加密的给定输入字符串将始终给出相同的输出。

这意味着,如果两个用户具有相同的密码,并且其中一个用户被盗用,那么另一个用户也会自动被盗用。

例如,假设我将密码设置为最常见的密码:“密码”。我得到了 AES 加密字符串。然后我将其更改为“123456”,并获取此加密字符串。我逐渐遍历前 10,000 个密码,生成 10,000 个加密字符串(及其未加密的密码)。我不知道用的是什么钥匙。

现在,我去找一个随机的其他用户。我有 90% 的机会可以在我的彩虹表中查找他们的 AES 加密密码,此时我可以准确地看到他们的密码是什么。

密码哈希也容易受到此影响。这就是为什么通常使用盐和胡椒粉的原因。

此外,对于较长的密码,如果输入的第一个块(16-32 个字符)匹配,则输出的第一个块也将匹配。因此,如果密码是“我的登录名是 AMADANON Inc.”,而其他人的密码是“我的登录名是 Harry Cho”,而我的密码被泄露,那么您密码的前 16 个字符也是已知的。

虽然这些问题可能会得到解决,但还有一个更大的问题:如果有人获得了 AES 密钥,那么所有的密码都是明文的。AES 密钥不可避免地存储在非常接近加密密码的位置(在同一台机器上)。您应该接受这一点,如果恶意软件同时使用 AES 密钥和 AES 加密密码进入服务器,那么它们就会受到威胁。

存储 AES 加密密码的唯一原因是在客户端,如果您无法控制服务器端。永远不要在服务器上执行此操作 - 使用来自标准库的良好标准哈希,以及盐和胡椒。

如果您同时编写客户端和服务器,则根本不要使用密码。此时,您不是在验证用户,而是在验证一台机器。对于验证机器,密码是错误的工具。相反,使用公钥加密——例如 TLS,与客户端身份验证——同样,已经为您编写了库。如果您也想对用户进行身份验证,请在私钥上输入密码。公钥加密的优点是秘密永远不会通过网络传播,服务器不知道它是什么;您证明您拥有它而不将其提供给服务器。