我有两段代码使用Java的“SHA256withRSA”Signature。一种方法是一个InputStream装饰者,通过read()方法的字节更新签名字节:为什么SHA256withRSA签名在计算逐字节与全部一次时不同?
public class SigningInputStream extends InputStream {
// Removed for brevity: declaration of useful objects
@Override
public int read() throws IOException {
final int nextByte = source.read();
try {
sign.update((byte) nextByte);
} catch (java.security.SignatureException e) {
throw new IOException("Unknown exception while signing file", e);
}
return nextByte;
}
// Removed for brevity
}
其他生成签名一下子:
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initSign(privateKey);
sign.update(contents);
byte[] signature = sign.sign();
return Base64.getEncoder().encodeToString(signature);
这两种方法给我不同的结果。我仍在阅读spec(我发现链接到另一个SO问题),但我不认为我完全理解它。为什么两种签名方法(逐字节比较一次)会产生不同的签名?
如果'INT nextByte'恰好是'-1',你必须避免做'sign.update((byte)nextByte)'。 – mkl