使用充气城堡处理错误的密钥存储区密码

时间:2019-07-12 11:05:16

标签: java bouncycastle

我正在按如下方式加载密钥库:

try
{
  ks = KeyStore.getInstance("BKS", "BC"); 
  ks.load(ksStream, ksPass);
}
catch (IOException e)
{
  if (e.getCause() instanceof UnrecoverableKeyException)
    System.err.println("Wrong password!");
}

问题是该异常的原因不是由充气城堡设置的(它为空)。

该如何解决?

1 个答案:

答案 0 :(得分:0)

无法确定是否无法正确加载BKS密钥库是由于密码错误,数据损坏或两者导致的。这种不确定性的原因是因为BKS格式中没有专门用于测试密码正确性的字段。可用的是在密钥库的主体上计算出的消息身份验证代码(MAC)。如果MAC检查成功,则您可以确信所有内容(包括密码)都是正确的。如果MAC失败,则问题可能出在密码或数据损坏,或两者都有。

使用IOException来传达此问题是一个糟糕的选择,并且可能是Sun工程师的原始设计的痕迹。由于Bouncycastle仅仅是JCE框架中的引擎,因此它们必须遵守KeyStore.load()的签名,包括异常规范。我查看的Bouncycastle的版本在异常中包含一条详细消息"KeyStore integrity check failed.",该消息至少可以识别由MAC故障引起的异常,而不是实际的I / O问题。