我应该如何为AES加密数据库条目派生密钥和初始化向量?

我已经构建了一个CMS系统,允许用户在我的客户端的Intranet应用程序上创建和管理在线表单。

当然,表单处理的一些数据可能需要加密,例如,如果系统用于构建处理工资细节或其他任何内容的表单。 所以我使用AESManaged类在进入我们的应用程序db之前对这种数据进行对称加密。

一切都很好,但现在,在发布之前,我可以做一个关于shared secretsalt的转向。

我最初的想法是通过将包含加密字段的Form的(基于GUID的)ID与问题的(再次,基于GUID的)ID相结合来创建(动态) shared secret ,该字段是以下答案:

 FormId:QuestionId 

我的Salt目前以相同的方式生成,只有Guids顺序颠倒了。

 QuestionID:FormID. 

我是新手,所以不确定这是一个明智的策略,还是我应该以其他方式做到这一点?

盐应该是随机生成的值。 其目的是使字典/暴力攻击更难以执行。 维基百科有一篇关于加密盐的好文章: http : //en.wikipedia.org/wiki/Salt_ ( cryptography)

理想情况下,对于共享密钥,它不会是未加密存储的值,而是加密的数据(例如您的ID)。 通常最佳做法是由最终用户或管理员以某种方式选择密钥,以便他们可以定期轮换密钥或者如果发生某种安全漏洞。 此密码密钥可以由CMS的每个用户拥有,也可以由管理员帐户拥有。 如果您有非常严格的安全要求,可以使用第三方密钥管理服务器。

如果这里的主要目标更多是混淆,并且CMS不会受到某种forms的安全审核,那么就像你最初的想法那样。 它可以防止随意访问数据,但可能不会通过审计来反对需要随机盐的正式标准,旋转密钥的方法,以及系统“所有者”更改密码的方法,以便你自己无法访问数据。