【发布时间】:2013-11-05 20:21:39
【问题描述】:
我实现了一种加密格式(以MultiCipherOutputStream 和MultiCipherInputStream 的形式),它支持将多个密码流相互嵌套。目标是产生一种灵活的加密文件格式,即使是最偏执的用户也能满意。虽然我相信我已经收集了很多关于如何实现这样的东西的知识,但我并不是一个深入的加密专家。背景:加密格式适用于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