使用充气城堡处理错误的密钥库密码
Handle wrong key store password with bouncy castle
我正在按如下方式加载密钥库:
try
{
ks = KeyStore.getInstance("BKS", "BC");
ks.load(ksStream, ksPass);
}
catch (IOException e)
{
if (e.getCause() instanceof UnrecoverableKeyException)
System.err.println("Wrong password!");
}
问题是异常的原因不是bouncy castle设置的(它是null)
如何解决这个问题?
无法确定加载 BKS 密钥库失败是由于密码不正确还是数据损坏或两者兼而有之。造成这种不确定性的原因是因为 BKS 格式中没有专门用于测试密码正确性的字段。所有可用的是在密钥库主体上计算的消息身份验证代码 (MAC)。如果 MAC 检查成功,那么您可以确信包括密码在内的所有内容都是正确的。如果 MAC 失败,则问题可能是密码或数据损坏,或两者兼而有之。
使用 IOException
来表达这个问题是一个糟糕的选择,可能是 Sun 工程师最初设计的遗迹。由于 Bouncycastle 只是 JCE 框架中的一个引擎,它们必须遵守 KeyStore.load()
的签名,包括异常规范。我查看的 Bouncycastle 版本在异常中包含一条详细消息 "KeyStore integrity check failed."
,它至少可以将异常识别为由 MAC 故障引起的,而不是实际的 I/O 问题。
我正在按如下方式加载密钥库:
try
{
ks = KeyStore.getInstance("BKS", "BC");
ks.load(ksStream, ksPass);
}
catch (IOException e)
{
if (e.getCause() instanceof UnrecoverableKeyException)
System.err.println("Wrong password!");
}
问题是异常的原因不是bouncy castle设置的(它是null)
如何解决这个问题?
无法确定加载 BKS 密钥库失败是由于密码不正确还是数据损坏或两者兼而有之。造成这种不确定性的原因是因为 BKS 格式中没有专门用于测试密码正确性的字段。所有可用的是在密钥库主体上计算的消息身份验证代码 (MAC)。如果 MAC 检查成功,那么您可以确信包括密码在内的所有内容都是正确的。如果 MAC 失败,则问题可能是密码或数据损坏,或两者兼而有之。
使用 IOException
来表达这个问题是一个糟糕的选择,可能是 Sun 工程师最初设计的遗迹。由于 Bouncycastle 只是 JCE 框架中的一个引擎,它们必须遵守 KeyStore.load()
的签名,包括异常规范。我查看的 Bouncycastle 版本在异常中包含一条详细消息 "KeyStore integrity check failed."
,它至少可以将异常识别为由 MAC 故障引起的,而不是实际的 I/O 问题。