我有一个使用证书对字符串进行签名的 java 应用程序。它可以使用 SHA1 加密字符串。我正在尝试将代码转换为 Delphi 2010,但我不知道如何让它以与 java 应用程序相同的方式工作(使用 sha1)。到目前为止,我发现了这个:
它确实有效,但它不使用 sha1,当我运行 java 应用程序时我得到不同的结果。
Java 代码
char[] pass = (char[]) null;
PrivateKey key = (PrivateKey) getKeyStore().getKey(alias, pass);
Certificate[] chain = getKeyStore().getCertificateChain(alias);
CertStore certsAndCRLs = CertStore.getInstance("Collection", new CollectionCertStoreParameters(Arrays.asList(chain)), "BC");
X509Certificate cert = (X509Certificate) chain[0];
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addSigner(key, cert, CMSSignedDataGenerator.DIGEST_SHA1);
gen.addCertificatesAndCRLs(certsAndCRLs);
CMSProcessable data = new CMSProcessableByteArray(conteudoParaAssinar);
CMSSignedData signed = gen.generate(data, true, "SunMSCAPI");
byte[] envHex = signed.getEncoded();
CertInfo certInfo = new CertInfo();
certInfo.Hash = new BigInteger(envHex).toString(16);
return certInfo;
德尔福代码
var
lSigner: TSigner;
lSignedData: TSignedData;
fs: TFileStream;
qt: integer;
ch: PChar;
msg : WideString;
content : string;
cert: TCertificate;
begin
cert := Self.GetCert;
content := 'test';
lSigner := TSigner.Create(self);
lSigner.Certificate := cert.DefaultInterface;
lSignedData := TSignedData.Create(self);
lSignedData.content := content;
msg := lSignedData.Sign(lSigner.DefaultInterface, false, CAPICOM_ENCODE_BASE64);
lSignedData.Free;
lSigner.Free;
编辑
基于java代码,我应该以二进制格式获取证书信息,对其应用sha1并将其转换为十六进制吗?这是正确的顺序和java代码所做的一样吗?我可以在 capicom tlb 中看到一些 SHA1 常量以及一个哈希类,也许我应该使用这些类,但我不知道如何使用。