文章标题


    /// 验证签名
    public static boolean Verify(String Xml, String publicKeyPath) throws Exception {
        int begin = Xml.indexOf("<Signature>") + "<Signature>".length();
        int len = Xml.indexOf("</Signature>") - begin;

        String SignatureString = Xml.substring(begin, len+begin);
        String OriginalString = Xml.replace("<Signature>" + SignatureString + "</Signature>", "");
        // 将base64签名数据转码为字节
        byte[] signedBase64 = Base64Utils.decodeFromString(SignatureString);//(OriginalString.getBytes());
            // TODO 数字证书
            InputStream inStream = new FileInputStream(publicKeyPath);// 文件
            CertificateFactory cf = CertificateFactory.getInstance("X.509");//X.509
            X509Certificate cert = (X509Certificate) cf.generateCertificate(inStream);
            inStream.close();
            // 得到公钥
            RSAPublicKey publicKey = (RSAPublicKey) cert.getPublicKey();
            // 构建签名
            Signature signature = Signature.getInstance(cert.getSigAlgName());//SHA1WithRSA
            signature.initVerify(publicKey);
            signature.update(Base64Utils.encode(OriginalString.getBytes()));
            return signature.verify(signedBase64);
    }

    /**
     * <p>
     * 生成数据签名
     * </p>
     * 
     * @param data 源数据
     * @param keyStorePath 密钥库存储路径
     * @param alias 密钥库别名
     * @param password 密钥库密码
     * @return
     * @throws Exception
     */
     //如果已知私钥XXX.pfx,和私钥密码,但不清楚密钥库别名是什么,可以用以下命令查看私钥信息
     //keytool -v -list -storetype pkcs12 -keystore XXX.pfx
    public static String sign(String data, String keyStorePath, String alias, String password) 
            throws Exception {
         // 获取私钥
        FileInputStream in = new FileInputStream(keyStorePath);
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        keyStore.load(in, password.toCharArray());
        in.close();
        // 获得证书
        X509Certificate x509Certificate =(X509Certificate)keyStore.getCertificate(alias);
       // X509Certificate x509Certificate = (X509Certificate) getCertificate(keyStorePath, alias, password);
        // 取得私钥
        PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());
        // 构建签名
        Signature signature = Signature.getInstance(x509Certificate.getSigAlgName());
        signature.initSign(privateKey);
        signature.update(data.getBytes("utf-8"));
        byte[] sing = signature.sign();
        return Base64Utils.encodeToString(sing);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值