2

不久前,我写了一个“Password Locker”C# 应用程序作为加密练习。我想将数据移动到网络上,这样我就可以在任何地方访问它而不会泄露我的密码数据。我只是想通过社区来运行我的想法,以确保我不会犯错误,因为我不是加密专家。

这是我的设想:

  1. 在 C# 应用程序中,所有密码数据都使用用户提供的密码加密为单个文本块。我在 CBC 模式下使用 Rijndael(对称加密)。密码使用硬编码值加盐。
  2. 加密数据被发送到我的数据库
  3. 我转到我服务器上的网页并下载加密文本。使用客户端 javascript 我输入了我的密码。javascript将解密所有内容(仍然是客户端)

以下是我的假设:

  • 我假设所有传输都可以被拦截
  • 我假设可以拦截 javascript(包含解密算法和硬编码盐)(因为它实际上只是在网络上)
  • 密码不能被截取(因为它只是输入客户端)
  • 结果是窥探的人可以拥有除密码之外的所有内容。

因此,基于这些假设:我的数据安全吗?我意识到我的数据与密码强度一样安全......我可以做些什么来改进它?Rijndael 解密是否足够慢以防止暴力攻击?

我考虑过使用随机盐值,但这仍然需要传输,因此,它似乎不会更安全。我的偏好是不在网络上以任何形式(散列或其他)存储密码。

编辑: 我正在考虑使用 SSL,所以我的“拦截”假设在这种情况下可能无效。

编辑 2: 根据 Joachim Isaksson 的评论,我将使用 SSL 运行。请继续打破我的假设!

编辑 3: 根据 Nemo 的评论,我将根据每个用户使用盐。此外,我正在使用 PBKDF2 根据密码派生密钥,所以这就是我将获得“缓慢”以抵抗暴力攻击的地方。

4

3 回答 3

2

甚至不以任何方式进行加密分析,如果您假设您的所有信息都可以被拦截(即您在没有 SSL 的情况下运行),那么您就不安全。

由于任何人都可以拦截 Javascript,因此他们还可以更改Javascript 以使浏览器在解密后将明文传递到其他地方。

此外,任何入侵网站的人(或网站所有者)都可以恶意更改 Javascript 以执行相同的操作,即使 SSL 已打开。

于 2012-09-26T21:00:06.957 回答
2

通过“密码数据”,我假设您的意思是“受密码保护的数据”?

盐确实需要是随机的。可以明文传输。盐的目的是防止字典攻击。也就是说,如果有人设法获得您的整个加密数据库,他们可以快速尝试针对您的所有用户的大型密码字典。使用随机盐,他们需要针对每个用户尝试字典。

或者,即使不损害数据库,他们也可以为大量字典单词生成大量预加密数据,并立即能够识别由任何这些密钥加密的任何已知明文。

即使使用盐,字典攻击也可能比您想要的更快,因此从密码中获取关键数据比大多数人意识到的要微妙得多。

底线:与往常一样,永远不要发明自己的密码学,甚至不要发明自己的操作模式。要从密码中获取加密密钥,请使用众所周知的标准,如PBKDF2(又名 PKCS#5)。

于 2012-09-26T21:11:39.300 回答
1

好吧,因为这是一个悬而未决的问题:


问题 #1

如果提供的密码不正确,或者盐/密文被更改,你会怎么做?你会得到一个不正确的解密结果,但你将如何测试呢?如果仅更改密文的最后一部分会发生什么?还是完全删除?

解决方案:针对此类攻击提供完整性保护。使用不同的密钥添加 HMAC 或使用 GCM 模式等模式。


问题 #2

如果更改或添加几个字节到密码会发生什么(及时比较加密存储)?

解决方案:每次使用不同的 IV 加密您的密钥库。


这已经发现了 4 个问题 :) 密码学很难。

于 2012-09-26T22:48:57.710 回答