`
peterwanghao
  • 浏览: 122515 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PKCS#7格式数字签名验证

阅读更多
名词解释
数字签名:在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;
}
分享到:
评论

相关推荐

    使用数字证书进行PKCS#7数字签名

    越来越多的应用需要我们使用USB接口数字证书进行PKCS#7数字签名。本文分别介绍了使用微软CryptoAPI方式和OpenSSL Engine方式进行数字签名。特别地,提出了OpenSSL Engine简化方式,这种方式更为灵活方便易行。

    PKCS7签名的ASN1格式

    可使用此格式,通过ASN1C生成完整的PKCS7签名C语言代码,实现诸如SM2算法数字签名及验证。 注意,CertificateSerialNumber本来在PKCS7标准ASN1结构中定义为INTEGER类型,但由于ASN1C将INTEGER类型翻译成long,不支持...

    capicom数字签名及验证源代码(pkcs#7)

    资源包中是capicom数字签名及验证源代码,可以直接点开运行,有需要的兄弟下载吧。

    PKCS7标准签名与验签

    PKCS7标准签名与验签,SHA1算法(项目添加引用System.Security)

    ietf-cms:Go的CMS(PKCS#7)库

    它是从PKCS#7演变而来,是更高级别协议(例如S / MIME)的基础。 该软件包实现了SignedData CMS内容类型,允许用户对数据进行数字签名以及验证其他人签名的数据。 签名和验证数据 提供了高级API,用于使用证书和...

    python-rsa:Python-RSA是纯Python RSA实现

    根据PKCS#1版本1.5,它支持加密和解密,签名和验证签名以及密钥生成。 它既可以用作Python库,也可以在命令行中使用。 该代码主要由Sybren A.Stüvel编写。 可以在找到文档。 对于所有更改,请检查 。 使用以下...

    rsa签名 C语言实现

    通过输入p q e算出公钥和私钥,用私钥签名,用公钥实现验证,也可以在签名之前先用哈希函数计算一下,这里我就没实现。

    OpenSSL-1_0_0d_Win32

    在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。 事实...

    endesive:加密,解密,si-gn,ve-rify-smime,pdf,xades和纯Python中的纯文件

    描述Python库,用于数字签名和邮件,PDF和XML文档中的数字签名验证。 ASN.1实现取决于 。 加密例程取决于库。 为了进行证书验证,使用了OpenSSL,但我不信任它,下一版本应切换为 。 该库实现了S / MIME处理程序,该...

    pysmime:用于SMIME基本功能的高级库,建立在M2Crypto之上

    pysmime3是在M2Crypto之上构建的python高级库,可与安全/多用途Internet邮件扩展(S / MIME,RFC 3851)一起使用,作为针对意大利数字签名的M2Crypto案例研究。 M2Crypto是SWIG在OpenSSL之上构建的python库包装。 ...

    openssl-1.0.0a

    在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。 事实...

    NCANode::star:用于与哈萨克斯坦共和国电子数字签名(EDS)配合使用的服务器应用程序

    :star: 与哈萨克斯坦共和国电子数字签名(EDS)一起使用的服务器应用程序如果你喜欢这个项目,那么把 :star:能力跨平台服务器(Windows,Mac OS,Linux) XML数据签名签名验证获取有关证书的信息检查到CCC的证书链...

    dfva:用于基于数字签名的安全身份验证的身份验证器服务器

    机构和机构的使用情况: 通用证书机构(PKCS11 en un futuro)。 实名制PKCS11。 Tantos las personas como las instituciones pueden: 抄写本autenticación。 固件文档XML(transacciones),ODF,MS Office,...

    IP.Works.S-MIME.v.9.0.5962.D6-XE10.1

    S/MIME不仅可以加密文件、邮件和新闻组文章,还可以用X.509数字证书署上消息签名、验证消息的签名。它包含的组件有:通用的S/MIME组件(SMIME)、证书管理(CertMgr)、可激活S/MIME的IP*Works! POP3、IMAP4、 NNTP...

    Java中RSA非对称密钥加解密使用示例

    RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为...

    JAVA_API1.6文档(中文)

    java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)...

    应用密码学,全文,doc被压缩无密码RAR

    2.7 带加密的数字签名 31 2.8 随机和伪随机序列的产生 33 第三章 基本协议 36 3.1 密钥交换 36 3.2 鉴别 40 3.3 鉴别和密钥交换 43 3.4 鉴别和密钥交换协议的形式分析 50 3.5 多密钥公开密钥密码学 53 3.6 秘密分割 ...

    openssl编程

    17.3 RSA签名与验证过程 108 17.4 数据结构 109 17.4.1 RSA_METHOD 109 17.4.2 RSA 110 17.5 主要函数 110 17.6编程示例 112 17.6.1密钥生成 112 17.6.2 RSA加解密运算 113 17.6.3签名与验证 116 第十八章 DSA 119 ...

    openssl 编程 当前版本

    17.3 RSA签名与验证过程 108 17.4 数据结构 109 17.4.1 RSA_METHOD 109 17.4.2 RSA 110 17.5 主要函数 110 17.6编程示例 112 17.6.1密钥生成 112 17.6.2 RSA加解密运算 113 17.6.3签名与验证 116 第十八章 DSA 119 ...

    rhonabwy:JWK,JWKS,JWS,JWE和JWT C库

    用于数字签名和MAC的受支持的加密算法( alg ): “ alg”参数值 数字签名或MAC算法 支持的 HS256 使用SHA-256的HMAC 是的 HS384 使用SHA-384的HMAC 是的 HS512 使用SHA-512的HMAC 是的 RS256 使用SHA-256...

Global site tag (gtag.js) - Google Analytics