在我的业务场景(基本上是云文件共享应用程序)中,我有以下情况:
用户将文件上传到文件夹
正在检查该文件夹是否受PIN保护
1)如果 不受PIN保护 ,请使用存储在应用程序+ IV键中的预定义密钥加密文件。 数据库中。
2)如果 受PIN保护 ,请使用存储在数据库中的预定义密钥+ PIN值+ IV密钥加密文件
问题是,当超过最大密钥大小(16,24,32字节)时,密钥长度有限的AES会获得无效密钥长度。我的主要问题是如何在保持安全的同时实现类似的目标。
目前文件夹的PIN长度不受限制,但似乎我应该将其限制为至少AES密钥传递的最大长度。稍微改进可能是使用RijndaelManaged,我对通行密钥长度有一点灵活性。
任何建议都将不胜感激。
注意:我认为代码不会为问题增加任何价值,但如果有人不同意,请告诉我,我会添加它。
答案 0 :(得分:1)
你的场景对我来说并不完全清楚,但总的来说,答案是使用你所拥有的“秘密”并将这些哈希值总是获得与AES相同的密钥长度。假设您使用SHA256来散列秘密,无论您使用哪种数据生成密钥,您的应用程序都可以使用AES-256。
同样,产生密钥的数据必须具有足够的熵并且必须保密。特别是当使用密码时,您应该使用安全密码来密钥派生方案,如PKCS#5,而不是自己构建一些东西......
答案 1 :(得分:1)
密钥派生函数将创建一个具有受控长度的密钥,如果派生密钥长于需要的密钥,则只截断它。
此外,加密IV不被认为是秘密的,通常只是加密数据的前缀。密钥派生盐以及迭代计数的许多时间点也是加密数据的前缀。为了获得良好的安全性,最好使用经过严格审查的方法。