我最近继承了一个内部构建的密钥存储系统。该公司将信用卡数据存储在两个经过 AES 加密的数据库服务器中。这些密钥位于一个单独的系统中,该系统位于其自己的 DMZ 中。当 Web 服务器需要加密某些数据时,通过 https 调用密钥服务器并请求密钥。它返回一个密钥和一个编码的序列号。应用服务器存储加密信息和序列号,然后丢弃密钥。当需要解密数据时,序列号被发送到密钥服务器,该服务器返回用于该记录的密钥。
开发这个的家伙没有使用密钥池。每个键都是唯一的随机值。密钥数据库使用由 2 个保管人提供的 2 个密码生成的密钥加密。据我所知,即使你拿到了钥匙,你也必须能够解码序列号才能使用它们,然后每把钥匙只能用于一个记录。他甚至用 c 语言编写了一个具有编码/解码功能的 php 扩展。
这似乎是一个相当不错的设计。任何人都对这种类型的事情有任何经验,可以对这种方法以及任何可能的漏洞或改进发表意见。