【发布时间】:2011-03-12 04:49:28
【问题描述】:
我正在制作一个网络服务,它将为数据库表中的每条记录存储公钥和私钥。
密钥是使用 Java 制作的,但我不确定是否可以创建密钥库或将密钥直接放在数据库中的字段中。
您会推荐什么选项以及每种方法的好处是什么?
【问题讨论】:
标签: java encryption-asymmetric
我正在制作一个网络服务,它将为数据库表中的每条记录存储公钥和私钥。
密钥是使用 Java 制作的,但我不确定是否可以创建密钥库或将密钥直接放在数据库中的字段中。
您会推荐什么选项以及每种方法的好处是什么?
【问题讨论】:
标签: java encryption-asymmetric
您可以为通过 http 发送数据的现有实现提供密钥库,这将获取密钥库并执行所有必要的操作,因此您不必这样做。 对于服务器端身份验证,这将是一个 keystore = KeyStore.getInstance("JKS"),其中包含所有受信任的证书。
对于客户端身份验证,如果适用(您需要验证自己)也已经存在此类实现 您只需提供您的客户'keystore' => 这个将包含您的证书,它是私钥 => KeyStore.getInstance("PKCS12")
最后你想把这些东西存储到数据库,这里有点棘手。密钥库是安全的,所以你不能把它写掉。你必须使用 keystore.store(OutPutstream, password)。 .
我觉得最好的例子是:
@Entity
public class MyKeyStoreClass {
private Long id;
@Transient
private KeyStore keystore;
private String passwordForKeyStore;
private Byte[] keyStoreAsBytes;
@PreUpdate
@PrePersist
public void concertKeyStoreToBytes() {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
keystore.store(byteArrayOutputStream,
passwordForKeyStore.toCharArray());
keyStoreAsBytes = byteArrayOutputStream.toByteArray();
}
@PostLoad
public void getKeyStore() {
if (keystore == null && keyStoreAsBytes != null) {
keyStore = KeyStore.getInstance(getKeystoreType().getType());
keyStore.load(new ByteArrayInputStream(keystoreAsBytes), passwordForKeyStore.toCharArray());
}
}
上面的代码不是 100% 正确的,但它让你很好地理解了我的意思,如果你不使用注释,你可以用另一种方法来做,但我认为我的观点很清楚 ;)
【讨论】:
你可以有一个数据库来存储用户信息而不是密钥,对于密钥最好使用密钥库。因此 userinfo 可能包含 {name, symmetric pass / hash, ...} 并使用该名称您应该能够识别密钥库中的密钥记录。再次记住,不要使用全局 (user,pass) 来读取密钥库,而是使用用户授权。
【讨论】:
为什么每条记录都有一个私钥?这是非常奇怪的设计。私钥通常由实体持有,例如代表他们行事的人员或服务器。
【讨论】:
如果您使用密钥库,您将使用专为保存加密项目(例如密钥和证书)而设计的数据库。
尽可能不要尝试重新发明轮子。密钥库足以解决您的问题吗?如果您尝试设计自己的数据库来存储这些人工制品,您将不得不重新解决在创建诸如 Java 的密钥库之类的数据库时已经考虑到的问题。
【讨论】: