签名验证SHA256withRSA(JAVA实现)

验证规则

收到應答消息後,執行以下步驟進行簽名驗證

1) 使用正則表達式把應答報文分為兩部分:報文(request/response)部分和簽名(signature)部分;
2) 使用SHA256算法對報文(request/response)部分獲取消息摘要;
3) 使用公鑰將簽名解碼為消息摘要;
4) 比較第2,3步驟的消息摘要,如果相同,說明原文沒有變化,驗證通過;

Java代码实现

引用包:

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

生成簽名:

    /**
     * rsa2Sign:rsa2签名
     *
     * @author zhangh
     * @param content
     * @param privateKey
     * @param charset
     * @return
     */
    public String signBySHA256WithRSA(String content, String privateKey, String charset){
        if(StringUtils.isBlank(privateKey)){
            //缺少签名私钥
            return null;
        }
        try {
            PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
            PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(priPKCS8);

            Signature signature = Signature.getInstance("SHA256withRSA");
            signature.initSign(priKey);
            signature.update(content.getBytes(charset));

            return Base64.encodeBase64String(signature.sign());
        } catch (Exception e) {
            //签名失败
            return null;
        }
    }

驗證簽名:

	public boolean verifyBySHA256WithRSA(String content, String sign, String publicKey, String charset){
        //1)	使用正則表達式把應答報文分為兩部分:JSON格式的報文(request/response)部分和簽名(signature)部分,注意為保證原文順序,不能轉為JSON對象去操作;
        //2)	使用SHA256算法對JSON格式的報文(request/response)部分獲取消息摘要;
        //3)	使用公鑰將簽名解碼為消息摘要;
        //4)	比較第2,3步驟的消息摘要,如果相同,說明原文沒有變化,驗證通過;
        if (StringUtils.isBlank(publicKey)) {
            //缺少验签公钥
            return false;
        }
        try {
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
            PublicKey pubKey = KeyFactory.getInstance("RSA").generatePublic(keySpec);

            Signature signature = Signature.getInstance("SHA256withRSA");
            signature.initVerify(pubKey);
            signature.update(content.getBytes(charset));
            return signature.verify(Base64.decodeBase64(sign));
        } catch (Exception e) {
            //验签失败
            return false;
        }
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值