【发布时间】: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