我需要使用带有SHA-256
和EMSA-PKCS1-V1_5
编码以及RSA私钥的Java对数据进行签名。
此外,我需要在EMSA-PKCS1-V1_5
中使用填充类型1,这意味着签名前的数据应附加零(不是随机数据,如填充类型2)。
相同数据上的签名输出应该相同。
Java在这种机制中的作用是什么?
我尝试使用SHA256withRSA
进行签名,但相同数据的输出始终不同。
修改
我正在使用以下代码(data,sigAlg和cert始终相同,所以我假设签名应始终相同):
CMSSignedDataStreamGenerator generator = new CMSSignedDataStreamGenerator();
String sigAlg = "SHA256withRSA";
ContentSigner contentSigner = new JcaContentSignerBuilder(sigAlg).setProvider("BC").build(getPrivateKey());
generator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()).build(contentSigner, cert));
generator.addCertificates(new JcaCertStore(certs));
OutputStream out = generator.open(responseOutputStream);
out.write(data);
out.close();