名词解释
数字签名:在ISO7498-2标准中定义为:"附加在数据单元上的一些数据,或是对数据单元所作的密码变换,这种数据和变换允许数据单元的接收者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被人(例如接收者)进行伪造"。
PKCS#7:也叫做加密消息的语法标准,由RSA安全体系在公钥加密系统中交换数字证书产生的一种加密标准。PKCS#7描述数字证书的语法和其他加密消息——尤其是,数据加密和数字签名的方法,也包含了算法。当使用PKCS#7进行数字签名时,结果包含签名证书(一列相关证书撤回列表)和已证明路径上任何其他证书。如果使用PKCS#7加密数据,通常包含发行者的参考消息和证书的序列号,它与用于解密已加密数据的公共密钥相关。
PKCS#7标准定义了多种内容类型,包括下面这些:
·数据:字节或8位元组串。
·签名设计:随加密数据摘要一起的数据。一个信息摘要是一个哈希算法的结果(术语摘要和散列是相同定义的)。使用信息摘要保证原始消息在传输过程中没有被篡改,并确认发送者的身份。
·封装数据:密文加上公钥能够解密数据。用这种方法保持消息内容对所有人保密,都是信任收件人。
·签名和加密数据:有公钥的加密内容和双重加密的消息摘要。
·摘要数据:数据加上消息摘要。
·单独的加密数据:在这种情况,加密数据的公钥必须通过其他机制传输。
实现方法
1、 使用java自带的安全包。由于jdk中没有对PKCS#7格式签名数据的处理。在做验证时需要三个参数:原文;签名数据和签名者证书/签名者公钥,都是BASE64编码。代码如下:
public boolean SignedData_Verify(byte[] signData,byte[] signedData,byte[] cert) {
boolean verifyRet = true;
try {
// 创建Factory对象
CertificateFactory oCf = CertificateFactory.getInstance("X.509");
// 创建X509证书对象
InputStream ois = new ByteArrayInputStream(cert);
X509Certificate oCert = (X509Certificate)oCf.generateCertificate(ois);
// 创建签名对象
Signature oSign = Signature.getInstance("SHA1withRSA");
// 初始化签名对象
oSign.initVerify(oCert);
// 传入签名原文
oSign.update(signData);
// 验证数字签名
verifyRet = oSign.verify(signedData);
}
catch (Exception e) {
verifyRet = false;
e.printStackTrace();
System.out.println("验证数字签名失败");
}
return verifyRet;
}
2、 通过bouncycastle的CMSSignedData可以实现pkcs#7格式签名数据的验证,利用CMSSignedData生成pkcs#7格式签名数据。由于pkcs#7里面包含了原文和证书信息,所以参数只需要签名值即可。代码如下:
public boolean SignedData_Verify(byte[] SignedData) {
boolean verifyRet = true;
try {
// 新建PKCS#7签名数据处理对象
CMSSignedData sign = new CMSSignedData(signedData);
// 添加BouncyCastle作为安全提供
Security.addProvider(new
org.bouncycastle.jce.provider.BouncyCastleProvider());
// 获得证书信息
CertStore certs = sign.getCertificatesAndCRLs("Collection", "BC");
// 获得签名者信息
SignerInformationStore signers = sign.getSignerInfos();
Collection c = signers.getSigners();
Iterator it = c.iterator();
// 当有多个签名者信息时需要全部验证
while (it.hasNext()) {
SignerInformation signer = (SignerInformation) it.next();
// 证书链
Collection certCollection = certs.getCertificates(signer
.getSID());
Iterator certIt = certCollection.iterator();
X509Certificate cert = (X509Certificate) certIt.next();
// 验证数字签名
if (signer.verify(cert.getPublicKey(), "BC")) {
verifyRet = true;
} else {
verifyRet = false;
}
}
}
catch (Exception e) {
verifyRet = false;
e.printStackTrace();
System.out.println("验证数字签名失败");
}
return verifyRet;
}
分享到:
相关推荐
越来越多的应用需要我们使用USB接口数字证书进行PKCS#7数字签名。本文分别介绍了使用微软CryptoAPI方式和OpenSSL Engine方式进行数字签名。特别地,提出了OpenSSL Engine简化方式,这种方式更为灵活方便易行。
在企业微信支付到个人银行卡的过程中,涉及到的关键技术之一是公钥加密与数字签名,这确保了交易的安全性。本文将详细解析如何将PKCS#1格式的公钥转换为PKCS#8格式,以解决“公钥非法错误”的问题。 首先,理解公钥...
4. **封装签名到PKCS#7结构**:签名后,需要将它封装到PKCS#7格式中。这可以通过`Pkcs7SignedData`类来完成,该类可以添加签名、证书链以及其他信息到PKCS#7结构中。 5. **序列化PKCS#7结构**:将封装好的PKCS#7...
PKCS(Public Key Cryptography Standards)是由RSA安全公司提出的公钥加密标准,其中的第7号标准(PKCS #7)定义了数据的数字签名、证书和消息认证码(MAC)的格式。在C#中,我们可以利用System.Security....
PKCS#7是RSA安全公司制定的一套公钥加密标准,主要处理数字签名、消息认证码(MAC)、加密和证书等。在支付系统中,PKCS#7常用于构建包含签名信息的完整证书或消息,以确保数据来源的可信性和完整性。它支持多种...
4. 封装签名:将原始消息、数字签名和可能的证书信息打包成PKCS#7格式。 5. 验证签名:接收方使用发送方的公钥解密数字签名,再对比解密后的哈希值与重新计算的消息摘要,以验证签名的完整性和消息的来源。 6. ...
总的来说,掌握PKCS#10和ASN.1对于理解数字证书的申请和管理至关重要,这对于网络服务器的安全配置、企业内部的身份验证以及各种在线服务的访问控制都有深远影响。无论是开发安全系统还是进行系统管理员工作,都需要...
PKCS#7(Public-Key Cryptography Standards #7)是由RSA Security提出的一种标准,它定义了证书、证书撤销列表(CRL)的格式以及数字签名、加密和消息认证码(MAC)等操作。在PKCS#7签名中,原始数据和签名一起打包...
在.NET环境中,通常通过`System.Security.Cryptography.Pkcs`命名空间中的类来处理PKCS#7格式的数据。Capicom虽然已被弃用,但在处理PKCS#7签名时,它提供了一个简洁的接口。 资源包中的`CAPICOM_HTML签名及验证...
PKCS#7是一种基于ASN.1编码的规范,用于封装和验证数字签名。它不仅包含了公钥加密标准,还定义了如何打包和验证数字签名、证书链以及加密数据。PKCS#7支持多种加密算法和签名算法,是安全电子邮件、HTTPS和其他安全...
- **PEM 兼容性**:此标准与 PEM(隐私增强邮件)兼容,这意味着使用 PKCS #7 标准签名和加密的消息可以轻松转换为 PEM 格式,反之亦然。 - **支持多种密钥管理架构**:虽然 PKCS #7 支持各种基于证书的密钥管理系统...
通过调用PKCS #11库,开发者可以轻松地集成硬件加密功能,例如在HTTPS服务器证书的管理、数字签名的生成和验证等方面。总的来说,PKCS #11是一个强大的工具,它促进了密码学在软件开发中的广泛应用。
9. **签名和验证**:`C_Sign`和`C_Verify`用于创建数字签名和验证签名,确保数据完整性和来源真实性。 10. **哈希计算**:`C_Digest`函数可以对数据进行哈希运算,支持MD5、SHA-1等多种哈希算法。 11. **对象复制*...
这些方案使用私钥创建可验证的数字签名,并使用公钥进行验证。 8. **ASN.1语法** ASN.1是一种标准化的编码规则,用于表示复杂的数据结构。在PKCS #1中,它用于表示RSA密钥和证书,以便在不同的系统间交换和存储。 ...
- **数字签名验证**:使用RSA公钥对签名S进行验证,确认其对应的消息是否未被篡改。 **5. 加密模式和填充机制** 为了提高安全性和防止信息泄露,PKCS #1定义了多种填充模式,如OAEP(Optimal Asymmetric Encryption...
这个标准允许应用程序利用这些物理设备进行安全操作,如加密、解密、签名和验证数字签名等。中文文档的出现对于中国开发者来说是一个非常实用的资源,它消除了语言障碍,使得理解和应用PKCS #11变得更加容易。 文档...
PKCS#1专注于RSA算法的数字签名和密钥生成,它详述了数字签名的计算方法,以及待签名数据和签名数据的具体格式。此外,规范还明确了RSA公钥和私钥的语法结构,为RSA加密技术的实现提供了标准化的指导。 标题“PKCS#...
在IT行业中,数字签名证书是网络安全的重要组成部分,用于验证网络通信双方的身份,确保数据的完整性和机密性。PKCS#12(Public-Key Cryptography Standards #12)是一种常用的证书存储格式,它包含了用户的公钥、...
PKCS#7 标准描述了加密消息语法的基本概念和结构,包括数字签名、数字信封和证书颁发。该标准提供了一个通用的框架,用于定义和实现加密消息的格式和结构。 2. 数字签名和数字信封 PKCS#7 标准定义了数字签名和...