【问题标题】:Storing public and private keys in a Database or keystore将公钥和私钥存储在数据库或密钥库中
【发布时间】:2011-03-12 04:49:28
【问题描述】:

我正在制作一个网络服务,它将为数据库表中的每条记录存储公钥和私钥。

密钥是使用 Java 制作的,但我不确定是否可以创建密钥库或将密钥直接放在数据库中的字段中。

您会推荐什么选项以及每种方法的好处是什么?

【问题讨论】:

    标签: java encryption-asymmetric


    【解决方案1】:

    您可以为通过 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% 正确的,但它让你很好地理解了我的意思,如果你不使用注释,你可以用另一种方法来做,但我认为我的观点很清楚 ;)

    【讨论】:

      【解决方案2】:

      你可以有一个数据库来存储用户信息而不是密钥,对于密钥最好使用密钥库。因此 userinfo 可能包含 {name, symmetric pass / hash, ...} 并使用该名称您应该能够识别密钥库中的密钥记录。再次记住,不要使用全局 (user,pass) 来读取密钥库,而是使用用户授权。

      【讨论】:

        【解决方案3】:

        为什么每条记录都有一个私钥?这是非常奇怪的设计。私钥通常由实体持有,例如代表他们行事的人员或服务器。

        【讨论】:

        • 每条记录代表一个应用程序。所以每个应用程序都有自己的私钥和公钥。
        【解决方案4】:

        如果您使用密钥库,您将使用专为保存加密项目(例如密钥和证书)而设计的数据库。

        尽可能不要尝试重新发明轮子。密钥库足以解决您的问题吗?如果您尝试设计自己的数据库来存储这些人工制品,您将不得不重新解决在创建诸如 Java 的密钥库之类的数据库时已经考虑到的问题。

        【讨论】:

        • 我的表中的每条记录都需要以某种方式链接到密钥库中的密钥。 IE。我需要一种方法来自动从密钥库中提取私钥(以及来自数据库的信息)并加密消息然后将其发送回用户。那么我应该将密钥库密码存储在数据库记录中吗?如何以安全的方式解决此问题?您会看到每行不仅仅是公钥/私钥,我还有 id、价格、名称...等。
        猜你喜欢
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 2013-08-06
        • 2011-01-29
        • 1970-01-01
        • 2020-02-01
        • 2020-11-29
        • 1970-01-01
        相关资源
        最近更新 更多