zoukankan      html  css  js  c++  java
  • 数字证书私钥sign及验证

    package com.epay.bank.test.encrypt;
    
    import java.io.FileInputStream;
    import java.security.KeyStore;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.Signature;
    import java.security.cert.CertificateFactory;
    import java.security.cert.X509Certificate;
    import java.util.Enumeration;
    
    import org.apache.log4j.Logger;
    
    import sun.misc.BASE64Encoder;
    
    public class TestNetpaySignature {
        private static Logger logger = Logger.getLogger(TestNetpaySignature.class);
        /**
         * 根据原数据和指定的加密算法来生成用户的签名数据
         * 
         * @param algorithm
         *            :使用的加密算法,为SHA1withRSA
         * @param srcData
         *            :被签名数据,byte[]类型
         * @param jksPath
         *            :商户私钥jks文件存放路径
         *  @param jksPath
         *            :商户私钥密码
         * @return 已签名数据
         * @throws Exception
         */
        public byte[] sign(String algorithm, byte[] srcData, String jksPath,String jksPwd)
                throws Exception {
    
            try {
                // 获取JKS 服务器私有证书的私钥,取得标准的JKS的 KeyStore实例
                KeyStore store = KeyStore.getInstance("JKS");
    
                // 读取jks文件,path为商户私钥jks文件存放路径
                FileInputStream stream = new FileInputStream(jksPath);
    
                // jks文件密码,根据实际情况修改
                String passwd = jksPwd;
                store.load(stream, passwd.toCharArray());
    
                // 获取jks证书别名
                Enumeration en = store.aliases();
                String pName = null;
                while (en.hasMoreElements()) {
                    String n = (String) en.nextElement();
                    if (store.isKeyEntry(n)) {
                        pName = n;
                    }
                }
    
                // 获取证书的私钥
                PrivateKey key = (PrivateKey) store.getKey(pName,
                        passwd.toCharArray());
    
                // 进行签名服务
                Signature signature = Signature.getInstance(algorithm);
                signature.initSign(key);
                signature.update(srcData);
                byte[] signedData = signature.sign();
    
                return signedData;
    
            } catch (Exception e) {
                throw new Exception("signature.sign.error");
            }
        }
        
        public String getSignedStr(byte[] signedData){
            logger.info("已签名" + new BASE64Encoder().encode(signedData));
            // 返回签名结果
            return new BASE64Encoder().encode(signedData);
        }
    
        /**
         * 根据对签名数据使用签名者的公钥来解密后验证是否与原数据相同。从而确认用户签名正确
         * 
         * @param 使用的加密算法
         *            ,需与加密时使用的算法一致
         * @param srcData
         *            被签名数据,byte[]类型
         * @param signedData
         *            使用该用户的私钥生成的已签名数据
         * @param path商户公钥证书cer文件存放路径
         * @return true或false,验证成功为true。
         * @throws Exception
         */
    
        public boolean verify(String algorithm, byte[] srcData, byte[] signedData,
                String path) throws Exception {
            // 获取指定证书的公钥
            CertificateFactory certInfo = CertificateFactory.getInstance("x.509");
            X509Certificate cert = (X509Certificate) certInfo
                    .generateCertificate(new FileInputStream(path));
            PublicKey publicKey = cert.getPublicKey();
    
            // 进行验证签名服务
            try {
                Signature sign3 = Signature.getInstance(algorithm);
                sign3.initVerify(publicKey);
                sign3.update(srcData);
                return sign3.verify(signedData);
            } catch (Exception e) {
                throw new Exception("signature.verify.error");
            }
        }
        
        
    
        public static void main(String[] args) {
            StringBuffer srcData = new StringBuffer();
    
            srcData.append("1");
            
            TestNetpaySignature testNetpaySignature = new TestNetpaySignature();
            
            
            
            
            boolean flag = false;
            try {
                byte[] signedData = testNetpaySignature.sign("SHA1withRSA", srcData.toString().getBytes(), "D:\keystore\pinganmer.jks", "12345678");
                
                
                flag = testNetpaySignature.verify("SHA1withRSA", srcData.toString().getBytes(), signedData, "D:\keystore\pinganmer.cer");
                
            } catch (Exception e) {
                // TODO: handle exception
            }
            System.out.println(flag);
            
        }
    }
  • 相关阅读:
    微信小游戏和白鹭引擎开发实践
    css3D的魅力
    微信开发相关,了解一下
    谈程序员如何做好业务
    《母亲》
    2017最后一天回顾这一年
    从无到有<前端异常监控系统>落地
    记录项目版本升级angular4 ~ angular5
    一个程序员送给大学生弟弟的那些话
    [认证 & 授权] 3. 基于OAuth2的认证(译)
  • 原文地址:https://www.cnblogs.com/jinzhiming/p/5315432.html
Copyright © 2011-2022 走看看