当我在java.security.KeyStore下调用该函数时:
public final Key getKey(String alias, char[] password)
我收到以下错误:
java.security.UnrecoverableKeyException: Rejected by the jceks.key.serialFilter or jdk.serialFilter property
at com.sun.crypto.provider.KeyProtector.unseal(KeyProtector.java:352)
at com.sun.crypto.provider.JceKeyStore.engineGetKey(JceKeyStore.java:136)
at java.security.KeyStore.getKey(KeyStore.java:1023)
Run Code Online (Sandbox Code Playgroud)
任何Java文档中都不存在此错误,只会间歇性地发生.导致此错误的原因是什么以及如何解决?
更新:现在由@zeal透露,它与http://www.oracle.com/technetwork/java/javase/8u171-relnotes-4308888.html#JDK-8189997有关.因此,如果没有其他配置,只能使用几个Key实现选项.但是在发行说明中我发现了一个声明:
存储未序列化为上述类型的SecretKey的客户必须修改过滤器以使密钥可提取.
这似乎是新的东西,因为它表明密钥的序列化可以被程序覆盖,是否是使其他密钥类型与JCEKS密钥库兼容的唯一方法?
我觉得我完全错过了 Wildfly 中新的 JCEKS 密钥库格式的要点。也许你可以让我直截了当。
我们配置 Wildfly 的方式(以及大部分互联网指示我们,例如):
这一切到底完成了什么???
如果我们只使用 JKS 文件和嵌入在 standalone.xml 中的密码,系统很容易受到:
如果我们以描述的方式使用 JCEKS 容器,系统很容易受到:
如果我们将实际证书放在 JCEKS 文件中,这将有点有意义,在这种情况下,在第二种攻击情况下,蛮力和查找表攻击会更难,但到目前为止我还没有找到使用方法直接使用 https 连接器的 JCEKS 格式的密钥库。
真的,我太在意这个的唯一原因是我们显然有使用“保险库”的安全要求,但这似乎毫无意义。
更新:值得注意的是,通过使用保管库,您在 jboss 配置文件中使用了保管库的“隐藏”密码,但我无法弄清楚这意味着什么。显然,您的掩码密码 + salt + rounds 可以解锁 JCEKS 密钥库(source),所以我不确定掩码到底能完成什么。这似乎是第三级重定向。我必须错过一些东西......
当我尝试在 Windows 上使用 Oracle Java 8 JRE 172 打开 JCEKS 类型密钥存储时出现以下异常。这适用于早期版本的 JRE:
INFO: ObjectInputFilter REJECTED: null, array length: -1, nRefs: 1, depth: 1, bytes: 70, ex: n/a
[...call stacks omitted to protect the innocent...]
Caused by: java.io.IOException: Invalid secret key format
at com.sun.crypto.provider.JceKeyStore.engineLoad(JceKeyStore.java:856)
at java.security.KeyStore.load(Unknown Source)
[...]
Run Code Online (Sandbox Code Playgroud)
这看起来非常像JDK-8202506,但我使用 Java 8 并且我收到null了初始 INFO 消息。
这是同样的问题吗?
在我看来,JDK-8202506问题目前尚未在任何公共 JRE 版本中修复。我对吗?
更新 1
这看起来很相似,他们也没有解决方案:ATLAS-2642
更新 2
出于某种原因,Equinoxcom.sun.crypto.provider.SealedObjectForKeyProtector在升级后看不到该类,即使它在新 JDK 附带的 JRE 中很明显:
BundleClassLoader[foo.bar.baz.crypto].loadClass(com.sun.crypto.provider.SealedObjectForKeyProtector) failed.
java.lang.ClassNotFoundException: com.sun.crypto.provider.SealedObjectForKeyProtector …Run Code Online (Sandbox Code Playgroud) 我的代码使用 pyspark 连接到 sql server。对于该连接,我在 jceks 中获取加密密码。我如何解密该密码并用于从 sql server 加载表。请建议。
import pyspark
import re
from pyspark_llap import HiveWarehouseSession
from pyspark.sql.functions import struct
from pyspark.sql.functions import *
from pyspark.sql.session import SparkSession
spark = SparkSession \
.builder \
.appName("Python Spark SQL data source example") \
.getOrCreate()
hive = HiveWarehouseSession.session(spark).build()
df1 = spark.read.format("jdbc") \
.option("url", "URL") \
.option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \
.option("dbtable", "tableName") \
.option("user", "user") \
.option("password", "password_alias").load()
Run Code Online (Sandbox Code Playgroud) python password-protection password-encryption python-3.x jceks