我正在制作一个 Web 服务,它将为数据库表中的每条记录存储公钥和私钥。
密钥是使用 Java 制作的,但我不确定是否可以创建密钥库或直接将密钥放在数据库中的字段中。
您会推荐什么选项,每种方法的好处是什么?
我正在制作一个 Web 服务,它将为数据库表中的每条记录存储公钥和私钥。
密钥是使用 Java 制作的,但我不确定是否可以创建密钥库或直接将密钥放在数据库中的字段中。
您会推荐什么选项,每种方法的好处是什么?
如果您使用密钥库,您将使用一个旨在保存加密项目(例如密钥和证书)的数据库。
只要有可能,您不应该尝试重新发明轮子。密钥库足以解决您的问题吗?如果您尝试设计自己的数据库来存储这些人工制品,那么您将不得不重新解决在创建诸如 Java 的密钥库之类的数据库时已经考虑到的问题和问题。
您可以为已经存在的通过 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) 来读取密钥库,而是使用用户授权。