本页内容
验证数字签名
验证数字签名包含两个部分:验证签名有效和验证证书可信。
签名有效代表文档未被篡改,证书可信代表签名者是可信任的。一般来说,签名有效且证书可信才代表一个签名验证通过。
验证数字签名的关键代码如下:
java
CPDFDocument document = new CPDFDocument(context);
document.open(FileUtils.getAssetsTempFile(context, "Signed.pdf"));
// 获取文档中所有的数字签名。
for (int i = 0; i < document.getSignatureCount(); i++) {
CPDFSignature signature = document.getPdfSignature(i);
//检查签名者数组是否存在且不为空。
if (signature.getSignerArr() != null && signature.getSignerArr().length > 0) {
CPDFSigner signer = signature.getSignerArr()[0];
// 检查签名的有效性。
boolean verifyValid = signature.verify(document);
// 检查文档是否被修改。
boolean unmodified = signature.verifyDocument(document);
// 确定签名是否有效以及确定文档未被修改。
boolean isSignVerified = verifyValid && unmodified;
// 检查证书是否可信。
boolean certChainTrusted = signer.getCert().verifyGetChain(document.getContext(), signature);
boolean certificateIsTrusted = signer.getCert().checkCertificateIsTrusted(document.getContext());
boolean certIsTrusted = certChainTrusted || certificateIsTrusted;
// 检查证书是否过期。
boolean isExpired = signer.getCert().isExpired();
// 根据验证结果采执行相应的操作。
if (isSignVerified && certIsTrusted) {
// 签名有效并且证书可信。
// 执行相应的操作。
} else if (isSignVerified && !certIsTrusted) {
// 签名有效但证书不可信。
// 执行相应的操作。
} else {
// 签名无效。
// 执行相应的操作。
}
}
}
kotlin
val document = CPDFDocument(context)
document.open(FileUtils.getAssetsTempFile(context, "Signed.pdf"))
// 获取文档中所有的数字签名。
for (i in 0 until document.signatureCount) {
val signature = document.getPdfSignature(i)
// 检查签名者数组是否存在且不为空。
if (signature.signerArr != null && signature.signerArr.isNotEmpty()) {
val signer = signature.signerArr[0]
// 检查签名的有效性。
val verifyValid = signature.verify(document)
// 检查文档是否被修改。
val unmodified = signature.verifyDocument(document)
// 确定签名是否有效以及确定文档未被修改。
val isSignVerified = verifyValid && unmodified
// 检查证书是否可信。
val certChainTrusted = signer.cert.verifyGetChain(document.context, signature)
val certificateIsTrusted = signer.cert.checkCertificateIsTrusted(document.context)
val certIsTrusted = certChainTrusted || certificateIsTrusted
// 检查证书是否过期。
val isExpired = signer.cert.isExpired
// 根据验证结果采执行相应的操作。
if (isSignVerified && certIsTrusted) {
// 签名有效并且证书可信。
// 执行相应的操作。
} else if (isSignVerified && !certIsTrusted) {
// 签名有效但证书不可信。
// 执行相应的操作。
} else {
// 签名无效。
// 执行相应的操作。
}
}
}