我有一个记录一些数据的服务器应用程序。该数据使用运行时生成的 AES 进行加密,然后使用接收方公共证书对 AES 密钥进行加密。然后整批产品作为一个文件发送给接收者。
在接收方计算机上,使用接收方私有证书对 AES 密钥进行解密,并且可以解密数据并将其显示给用户。到目前为止一切都很好,有点像 PGP。
问题是该数据文件有时“按原样”存储。一段时间后,用于解密数据的证书就会过期。如果我们想象新证书必须包含新密钥,则所有使用旧证书存储的文件都必须重新加密。还有其他用例只是确认加密数据的长期存储不应使用证书。
不用说,创建数据的服务器不能包含任何可用于解密数据的存储密钥 - 所以我的问题是:我可以以某种方式改变这种设计,以便我可以支持接收者证书的更新/撤销,而无需必须在客户那里重新加密数据吗?
使用 C# 和 X509 证书(如果有的话)...
接收器可能会保留以前密钥的历史记录。然后,您的数据文件应包含对用于此数据文件解密的证书的引用(例如,指纹或客户端可用于唯一标识证书的任何其他内容)。 您可以使用过期的证书来解密内容。
您的场景类似于S/MIME(电子邮件加密)场景。发件人使用收件人的公钥加密电子邮件。证书信息(公共部分)包含在加密的 BLOB 中。收件人使用证书标识符来查找合适的私钥来解密电子邮件。收件人可以存储当前和所有以前的电子邮件加密证书和密钥,以解密其很久以前收到的电子邮件。证书有效性或过期不会阻止您解密数据。
这个策略并不是什么新鲜事,并且已经在其他类似场景中发挥作用。