我正在制作一个Web服务,它将为数据库表中的每条记录存储公钥和私钥。
密钥是使用Java制作的,但我不确定创建密钥库的天气或将密钥直接放在数据库中的字段中。
您会推荐什么选项?每种方法有哪些好处?
答案 0 :(得分:5)
如果您使用密钥库,则您将使用旨在保留加密项目的数据库,例如密钥和证书。
只要有可能,你就不应该试图重新发明轮子。密钥库是否足以满足您的需求?如果您尝试设计自己的数据库来存储这些文物,那么在创建Java密钥库等数据库时,您将不得不重新解决已经考虑的问题和问题。
答案 1 :(得分:3)
您可以为已经存在的通过http发送数据的实现提供密钥库,这将获取密钥库并执行所有必要的内容,因此您不必这样做。 对于服务器端身份验证,这将是一个keystore = KeyStore.getInstance(“JKS”),包含所有可信证书。
对于客户端身份验证,如果适用(您需要自己验证),此类实现也已存在 你只是提供你的客户'keystore'=>这个将包含您的证书,它的私钥=> KeyStore.getInstance( “PKCS12”)
然后最后你想把这些东西存放到数据库,这里有点棘手..密钥库是安全的,所以你不能只是写它...你必须使用keystore.store(OutPutstream,密码)。
我认为最好的是:
@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%正确,但它让你很清楚我的意思,如果你不使用注释,你可以使用另一种方法,但我认为我的观点是明确的;)< / p>
答案 2 :(得分:1)
为什么每条记录都有私钥?这是非常奇怪的设计。私钥通常由实体持有,例如人或代表他们的服务器。
答案 3 :(得分:0)
您可以拥有一个数据库来存储userinfo而不是密钥,对于密钥,最好使用密钥库。所以userinfo可能包含{name,symmetric pass / hash,...},并且使用该名称,您应该能够识别密钥库中的密钥记录。再次记住,不要使用全局(用户,传递)来读取密钥库,而是使用用户授权。