p1和p7签名的区别

前言:

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
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值