【问题标题】:Is this Java-based multi-cipher crypto format implementation secure? [closed]这种基于 Java 的多密码加密格式实现是否安全? [关闭]
【发布时间】:2013-11-05 20:21:39
【问题描述】:

我实现了一种加密格式(以MultiCipherOutputStreamMultiCipherInputStream 的形式),它支持将多个密码流相互嵌套。目标是产生一种灵活的加密文件格式,即使是最偏执的用户也能满意。虽然我相信我已经收集了很多关于如何实现这样的东西的知识,但我并不是一个深入的加密专家。背景:加密格式适用于Syncany,这是一种使用任意存储的类似 Dropbox 的文件同步工具。

所以我的问题是:

  • 这种加密格式的概念在密码学上是否合理?
  • 我的任何假设和设计概念是否错误或有问题?
  • 是否正确实施?

以下是格式说明:

Length       HMAC'd           Description
----------------------------------------------
04           no               "Sy" 0x02 0x05 (magic bytes, 4 bytes)
01           no               Version (1 byte)
12           no               Header HMAC salt            
01           yes (in header)  Cipher count (=n, 1 byte)

repeat n times:
  01         yes (in header)  Cipher spec ID (1 byte)
  12         yes (in header)  Salt for cipher i (12 bytes)
  (dyn.)     yes (in header)  IV for cipher i (cipher specific length, 0..x)    

32           no               Header HMAC (32 bytes, for "HmacSHA256")
(dyn.)       yes (in mode)    Ciphertext (HMAC'd by mode, e.g. GCM)

一般设计概念和假设:

  • 假设:所有用户共享一个密码
  • 输入参数:密码字符串、密码规范列表(例如 AES/GCM/NoPadding、128 位)
  • 密码用于使用 PBKDF2(12 字节盐,1k 轮)为每个密码派生一个对称密钥
  • 对称密钥用于加密文件;它在最大重复使用。 100 个文件 (~ 200 MB)
  • 密码算法是可配置的,但并非所有密码都允许:仅 AES 和 Twofish(128/256 位),仅经过身份验证的模式(目前只有 GCM;没有 ECB、CBC 等)
  • 密码使用随机初始化向量 (IV) 进行初始化,IV 永远不会重复使用
  • 可以嵌套/链接多个密码算法(1-n 个密码),例如AES-128 和 Twofish-256
  • 密码配置、IV 和盐使用 HMAC (SHA256) 进行身份验证

来源:

【问题讨论】:

  • 这属于“默默无闻的安全”的总标题。在整个社区中使用单个密码会限制其用途。
  • 关键用例是单个用户在一对多机器上同步。和连接详细信息(无论如何都必须共享到存储,例如 FTP 详细信息),因此在哑存储环境中必须完全信任。然而,适当指出的一点。一旦基本版本飞起来,多用户概念就会排在首位……“默默无闻的安全性”不是更适用于“试图隐藏机制”而不是“拥有对称密码”吗?
  • 它适用于依赖于攻击者不知道技术的任何技术,而不是加密密钥。一旦攻击者知道该技术,即在这种情况下是密码序列,这并不比最初的密钥强。
  • 这种解释会谴责所有基于密码的加密吗?你是想说“密码是邪恶的”吗?
  • 废话。这些都不是我在这里所说的。不要把话塞进我嘴里。

标签: java cryptography cryptoapi jce jca


【解决方案1】:

正如 EJP 已经规定的那样,您的方案在密钥管理方面不是很安全。执行此操作的常用方法是使用非对称密钥,例如PGP 密钥分配方案。目前只有一个人需要泄露密码,使这个方案变得不安全,没有人知道谁是罪魁祸首。

此外,相同的密码用于派生密钥。现在我假设这些密钥之一用于计算标头上的 HMAC。这意味着,如果对密码进行字典或暴力攻击是可行的,则可以通过标头检查 HMAC 的结果。一旦找到密码,就可以从中派生出其余的密钥。

因此,尽管您有多层加密,但您的密钥/密码管理方案中没有多层。攻击可能只会集中在您的密钥管理方案上,从而使您额外的几轮加密变得多余。实际上,最初使用具有更大盐和迭代计数的 PBKDF,然后在 PBKDF 的结果上使用 KBKDF 派生密钥,实际上已经更安全了。但即使这样也无法掩盖密钥管理的问题。

所以不,这个方案不是特别安全。

【讨论】:

  • 感谢您抽出宝贵时间详细解答!我现在明白该方案的弱点是密钥管理——特别是如果(如前所述)涉及更多用户。但是,假设只有一个用户或几个“受信任的”用户,如果我遵循您的想法,该方案是安全的 - 即:创建主密钥(PBKDF2 w/1MM 轮),并使用 HKDF 派生其他密钥。这会使蛮力(即使在 HMAC 上)不可行,对吧?
  • 当然,这仍然取决于密码的安全性。一个错误的或众所周知的密码作为生成密钥的唯一秘密输入将始终是一个漏洞。但是,如果唯一的密码是唯一的选择,你就不能做得更好了。
  • 我知道单个密码不是最好的方法,阅读您的评价后,我一定会研究如何实现非对称方案(考虑到应用程序的其余架构)。目前,典型的用户便利问题迫使我采用基于密码的方案。为了增加一点安全性,我正在计划严格的密码限制并检查一个基本的本地词汇表。
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2014-04-01
  • 1970-01-01
相关资源
最近更新 更多