我正在编写一个Android应用程序,旨在使用AES 256加密和解密文件。我使用AES-CBC模式和PBKDF2从用户输入的密码中导出AES密钥。此外,我正在为每个文件的加密密钥生成一个安全的伪随机盐。我将IV和salt与加密文件一起存储,因此我可以重新读取它们并稍后重新生成密钥以便能够解密文件。
我的问题:将盐与加密文件一起存储会破坏安全性和盐本身的任何含义吗?知道盐和IV的攻击者不能对加密文件进行离线暴力攻击以找出加密密钥吗?
答案 0 :(得分:10)
盐的主要目的不是秘密,而是为了确保攻击者在尝试暴力破解密码时不能使用快捷方式,例如使用彩虹表(即一个现有表或新表用于多个加密文件),或一次性强制多个收集的文件(应该有不同的盐)。
只要您的密码具有足够的熵并且密钥派生函数中的迭代次数足够高,将盐与密文一起存储就没有问题。 单独的盐不允许任何人解密该文件。
此外,如果你想保持盐的秘密(它通常被称为“胡椒”而不是盐),你将不得不考虑一些机制来获得合法解密的合适盐。 / p>
答案 1 :(得分:2)
Salt用于单向函数,例如哈希密码。
随机IV用于双向功能,例如加密以后可以解密的数据。
它们都是随机字节,用于防止同一条信息在被函数应用后产生相同的结果。因此,如果两个人选择相同的密码来存储他们的数据并存储相同的信息,加密的字节就会不同。
您可以将它们存储在加密文件旁边。
对PBKDF2使用超过1次迭代,否则它是相当无用的。根据{{3}},iOS 3使用2,000次迭代,iOS 4使用10,000次。