代码之家  ›  专栏  ›  技术社区  ›  D.R.

如何计算JAR的.SF签名文件中的SHA256散列?

  •  0
  • D.R.  · 技术社区  · 7 年前

    Name: com/sample/MySample.class
    SHA-256-Digest: TRqPMBJdQrIg5jHsAaoT1Rp5fjFjB8z/c2I+AHs5rX8=
    

    在签名文件(.SF)中,我必须为每个文件添加另一个SHA256散列,但我不确定它是如何计算的。这个 docs 假设它是对应清单块的SHA256散列,但是将字符串从“Name”散列到摘要的末尾并不会得到与JDK的原始jarsigner.exe相同的结果。

    如何计算这个散列?

    我试着散列各种不同的东西(例如,重新散列散列,散列整个块,仅散列名称和散列),但没有任何效果。有没有更好地描述散列内容的文档?

    1 回复  |  直到 7 年前
        1
  •  0
  •   JM Lord    6 年前

    首先,加载要在消息摘要中编码的字节。这就是对文件执行此操作的方法(添加必要的try-catch-finally块)。

    MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
    
    DigestInputStream digestIs = new DigestInputStream(new FileInputStream(fileToValidate), messageDigest);
    OutputStream nullOutputStream = new NullOutputStream();
    
    // Read all bytes for the DigestInputStream to see them
    IOUtils.copy(digestIs, nullOutputStream);
    digestIs.close()
    

    然后,正如您链接到的文档中所指定的,散列需要用base64表示。此代码将转换摘要 byte[]

    String fileDigest = new String(Base64.encode(messageDigest.digest(), Base64.NO_WRAP));
    

    这个 NO_WRAP 标记只移除额外的 \n 在绳子的末端。