我有兩段代碼使用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