【问题标题】:Java Keystore - cannot load a keystore when varbinary is stored as 0xJava Keystore - 当 varbinary 存储为 0x 时无法加载密钥库
【发布时间】:2019-07-11 16:02:04
【问题描述】:

我有一个存储在 Microsoft SQL 服务器数据库中的 JKS 密钥库。它存储为 varbinary 并保存为(例如)0x539A" - a very long varbinary. The data was loaded usingOPENROWSET(BULK 'location', SINGLE_BLOB) 格式。

当我对结果集执行以下操作时:

    InputStream is = new ByteArrayInputStream(keys);
    keyStore.load(is, ksPassword.toCharArray());

我遇到了异常:

  java.io.IOException: Invalid keystore format
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:658)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56)
    at sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224)
    at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70)
    at java.security.KeyStore.load(KeyStore.java:1445)

我不确定如何转换字节流,使其看起来像“[B@sdfsfs”,因为这就是其他键的字节流的样子。有人有什么建议吗?

【问题讨论】:

  • 我认为你不应该自己构建 inputStream 而是依赖 ResultSet 中的getBinaryStream("columnName") 并让 keystore 实例处理它。
  • 在 Java 中 [B@somehex 是字节 array 的默认显示 (toString()) 形式——不是任何流,尽管它们包含相似的可能相同的数据一个区别——但没有表明任何关于数组in的数据。你是说存储值中的第一个字节 53 9A?如果是这样,那绝对不是 JKS;JKS 总是 有前 4 个字节 FE ED FE ED。

标签: java sql-server-2016 keystore varbinary


【解决方案1】:

我使用CONVERT(varbinary(max), '0x0EB882727A', 1) 解决了这个问题 - 它已正确加载。密码是问题。

【讨论】:

  • 您不需要加密密钥库。密钥已经在内部加密,并且已经有自己的密码。
  • @user207421。这与加密密钥无关。这是为了确保密钥库在没有密码的情况下无法访问,并且位于应用程序控制之外。如有必要(在某些情况下),我们可以使用新密码重新部署应用程序和密钥。
猜你喜欢
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
相关资源
最近更新 更多