您所要做的就是所谓的密钥分发。密钥分发要求您使用安全通道。这可以是:
- 使用密码是对称的(但是您需要安全地分发密码,所以这有点像鸡和蛋的问题)。
- 数据库不被视为共享密钥的安全方式。
- SSL:非标准加密是一种方法,但在这种情况下,您可以首先在应用程序上实现SSL/TLS。类似于HTTPS (实际上,它使用混合加密交换对称密钥,然后与AES或另一个对称密码交换数据)
- 另一种选择是使用包含加密密钥(例如Yubikey)的硬件令牌。例如,这可以用于进行相互SSL身份验证。
关于你问题的第二部分:
- 这在很大程度上是有争议的,通常这取决于应用程序的用例及其加密数据的数量。它加密的数据越多,就需要更快地旋转它。但这都取决于算法等(例如,如果在同一密钥上加密超过64 GB,则AES GCM模式将失去保护。见NIST SP 800-38D节5.2.1.1)。所以没有一个正确的答案。如果您要选择SSL选项,那么每365天一次可能是您的最佳选择。
- 该变量是公共变量还是私有变量并不重要。需要注意的一点是,与其使用字符串,不如使用char数组(如果使用像Java或.NET这样的托管语言),以防止在机器崩溃时将密钥转储到memdump。其思想是在每次加密/解密之前加载密钥,然后在操作完成后用0's覆盖变量。这将减少钥匙泄漏的可能性。
使用SSL/TLS并在您的应用程序中固定证书将是最简单的,因为您实际上可以为您与客户端设置的每个会话使用不同的、相互商定的对称密钥。