【发布时间】:2011-03-19 13:35:56
【问题描述】:
当使用 Jasypt 的 StandardPBEStringEncryptor 时,我们必须在 spring bean 配置文件中明确设置密码。在 bean 配置文件中有密码是否可以且安全?存储加密器密码是否会成为 PCI 合规性问题?
【问题讨论】:
标签: security encryption spring-security pci-dss jasypt
当使用 Jasypt 的 StandardPBEStringEncryptor 时,我们必须在 spring bean 配置文件中明确设置密码。在 bean 配置文件中有密码是否可以且安全?存储加密器密码是否会成为 PCI 合规性问题?
【问题讨论】:
标签: security encryption spring-security pci-dss jasypt
此将不符合 PCI 标准。数据加密密钥不能以明文形式存储。具体点是3.5.2,即:
检查系统配置文件以 验证密钥是否存储在 加密格式,并且 存储密钥加密密钥 与数据加密密钥分开。
您可能还会在密钥管理领域遇到其他问题,例如 3.6.6(拆分知识和密钥的双重控制)
验证密钥管理程序 实施要求拆分 知识和钥匙的双重控制 (例如,需要两个或三个 人,每个人都只知道自己的 密钥的一部分,重建 整个键)。
Key management 是 PCI 合规性中最具挑战性的部分。您可能需要考虑使用(已经符合 PCI 的)第 3 方来管理您的卡数据。如果您自己动手,那么我建议您尽早获得 QSA(PCI 合格安全评估员)的帮助,以评估您计划实施的安全性。最终,您需要说服 QSA 才能通过您的 PCI 要求,他们会非常乐意提供建议。
【讨论】:
您需要将对称密钥存储在某处。配置文件是个好地方,只要没有人可以访问它。
【讨论】:
我有个主意
您可以使用 keystore.jks 的 keyPair 加密所有纯密码。您知道 keystore.jks 有自己的密码。您可以记住该密码,并在您的程序开始时在控制台上输入密码。例如当你的程序启动时:
Console console = System.console();
keyPair = loadKeystore(new String(console.readPassword()));
private static KeyPair loadKeystore(String pwd) {
InputStream is = Main.class.getResourceAsStream("/keystore.jks");
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(is, s.toCharArray());
String alias = "youralias";
Key key = keystore.getKey(alias, pwd.toCharArray());
if (key instanceof PrivateKey) {
// Get certificate of public key
Certificate cert = keystore.getCertificate(alias);
// Get public key
PublicKey publicKey = cert.getPublicKey();
// Return a key pair
return new KeyPair(publicKey, (PrivateKey) key);
}
return null;
}
当您返回密钥对时,您可以使用它来加密您的密码。
key = loadKeystore("yourpass").getPrivate().getEncoded()
祝你好运
【讨论】: