赞
踩
P1签名:即裸签名,签名值中只有签名信息.
p7签名:即,签名中可以带有其他的附加信息,例如签名证书信息,签名原文信息,时间戳信息等.
所以要注意,不要p7的签名,用p1的方式来验签,这样是不对的.是错误的.
1.对要签名的信息,用指定的hash算法,获取信息的hash值.
2.用私钥,对hash值进行加密,输出加密串(也就是签名值).
以上方式也就是裸签名,PKCS#1
1.对要签名的信息(也就是签名原文),用指定的hash算法,获取信息的hash值.
2.用公钥信息,解密签名值,从中获取加密的hash串,和上面获取的hash值进行对比,一致则认为验签通过,不一致则不通过.
需要注意,如果调用远程签名(比如电子签名),因为根据要签名的数据格式的不同,所以我们本地验签的时候,也要根据不同的签名方式,来进行验证(也就说,他们那边签名的时候,真正用来签名的字节数组是怎么来的)
目前常见的几种方式:(P1签名验签)
- contentType==CT_MESSAGE时,为待签名的消息;
- contentType==CT_BASE64_DATA时,为待签名的base64编码数据;
- contentType==CT_HASH时为待签名的HASH;
- contentType==CT_FILE_URL时为待签名文件地址URL
- contentType== CT_STORAGE时为待签名内容存储编号
CT_HASH:告诉签名方,我这个是对签名原文hash过了的hash串,你们直接对这个值进行加密即可,不需要再hash了.
所以这种方式,我们本地验签的时候,要将原文放入进行验签,而不是hash过后的hash值(因为验签的时候,它又会hash一次)
- /**
- * 测试hash方式的签名验签
- * @throws Exception
- */
- @Test
- public void testSignWithHash() {
- try {
- CertificateFactory cf = CertificateFactory.getInstance("X.509");
- Certificate usercert = cf.generateCertificate(new FileInputStream(USER_CERT));
- PublicKey publicKey = usercert.getPublicKey();
- //读取pfx证书上的秘钥对信息
- BouncyCastleProvider provider = new BouncyCastleProvider();
- Signature signature = Signature.getInstance("SHA1withRSA");
- MessageDigest digest = MessageDigest.getInstance("SHA-1", provider);
-
- List<UserInfo> userInfoList = userInfoService.findAll();
- UserInfo userInfo = userInfoList.get(0);
- Map<String, Object> puserCert = new HashMap<>();
- puserCert.put("userInfo", userInfo);
- List<UserCert> userCertList = userCertService.getListByParam(puserCert);
- UserCert userCert = userCertList.get(0);
- YuanZi_P1SignRequest yuanZiP1SignRequest = new YuanZi_P1SignRequest();
- yuanZiP1SignRequest.setAlias(userInfo.getAlias());
- yuanZiP1SignRequest.setHashAlg("SHA1");
- yuanZiP1SignRequest.setContentType("CT_HASH");
- String conten
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。