在我的应用程序中,需要在将用户数据插入 mysql 数据库之前对其进行加密。我正在使用 AES 算法使用 256 位散列加密数据(并将其称为数据加密密钥,简称 DEK)。
为了使系统更安全,DEK 不是以纯文本形式存储在应用服务器中,而是以加密形式 (en_dek) 存储在应用服务器中。加密 DEK 的密钥存储在一个完全独立的服务器中,称为密钥加密密钥 (KEK)。因此,每次要加密/解密数据时,首先使用 KEK 来解密 en_dek,这给了我实际的 DEK,然后使用这个 DEK 来加密/解密用户的数据。
现在我的问题是:
[1] 我应该将 (en_dek + data) 发送到密钥服务器还是应该将 KEK 获取到应用程序服务器?哪种做法更安全?
[2] 这两种方法都有一个缺陷,如果攻击者能够访问其中任何一个服务器,他就会同时了解 KEK 和 DEK。我们怎样才能防止这种情况发生?
[3] 当我们谈到密钥轮换时,两个密钥(DEK 和 KEK)中的哪一个是轮换的?