密钥/签名基础学习了解

  1. cer文件:
    用于存储公钥证书的文件格式

  2. 对称加密/非对称加密
    对称加密:使用一个密钥加密,使用同一个密钥解密,算法相同
    非对称加密:又称公开密钥加密,加密和解密使用不同的密钥算法

  3. Base64编码
    用于传输8Bit字节码的编码方式,可用于在HTTP环境下传递较长的标识信息

  4. 数字证书
    采用公钥体制,利用一对互相匹配的密钥进行加密、解密。通过数字的手段保证加密过程是一个不可逆过程,即只有用私钥才能解密,公钥加密

  5. 公钥/私钥:不对称加密方式
    1.数据加密,防止传输过程中被看到
    2.保证数据来源,防止冒充

    公钥:给大家用的,可发布给别人,让别人下载,其作用是用来加密/验章的
    私钥:属于自己的,不可公开,其作用是解密/签章
    每一个密钥的加密算法都是不同的
    公钥加密的内容只能私钥解密,私钥加密的内容只能公钥解密

  6. 加签/验签

/**
 * 加签名
 * @param dataString
 * @return
 */
public String signWhithsha1withrsa(String dataString) {
    String signatureString = null;
    // pfx文件路径
    String filePath=rootPath+PFXPATH;
    try {
        // 表示密钥和证书的存储设施-密钥库
        // PKCS12 一种交换数字证书的加密标准
        // 获取指定 PKCS12 类型的
        KeyStore ks = KeyStore.getInstance("PKCS12");
        FileInputStream fis = new FileInputStream(filePath);
        char[] nPassword = null;
        if (StringUtil.isEmpty(KEYSTORE_PASSWORD)) {
            nPassword = null;
        } else {
            nPassword = KEYSTORE_PASSWORD.toCharArray();
        }
        // 从指定输入流中加载 KeyStore
        ks.load(fis, nPassword);
        fis.close();
        System.out.println("keystore type=" + ks.getType());
        // 获取密钥库的所有别名
        Enumeration<String> enums = ks.aliases();
        String keyAlias = null;
        // 测试此枚举是否包含更多的元素
        if (enums.hasMoreElements())
        {
            // 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素
            keyAlias = (String) enums.nextElement();
            System.out.println("alias=[" + keyAlias + "]");
        }
        // 判断给定别名是否通过调用 setKeyEntry
        //  或者以 privateKeyEntry 或 SecretKeyEntry 为参数 setEntry 创建的
        System.out.println("is key entry=" + ks.isKeyEntry(keyAlias));
        // 获取和别名绑定的密钥,并用给定密码来恢复它
        PrivateKey prikey = (PrivateKey) ks.getKey(keyAlias, nPassword);
        // 获取和别名绑定的证书
        // Certificate / 管理各种身份证书
        // 身份证书是一个主体与由另一个主体所担保的公钥之间的绑定关系
        java.security.cert.Certificate cert = ks.getCertificate(keyAlias);
        // 从证书中获取公钥
        PublicKey pubkey = cert.getPublicKey();
        // 获取证书名
        System.out.println("cert class = " + cert.getClass().getName());
        System.out.println("cert = " + cert);

        System.out.println("-----------------公钥--------------------");
        System.out.println("public key = " + pubkey);
        System.out.println(new String(Base64.encodeBase64(pubkey.getEncoded())));
        System.out.println("-----------------公钥--------------------");

        System.out.println("-----------------私钥--------------------");
        System.out.println("private key = " + prikey);
        System.out.println(new String(Base64.encodeBase64(prikey.getEncoded())));
        System.out.println("-----------------私钥--------------------");

        // SHA1withRSA算法进行签名
        // 三种算法签名:MD2withRSA、MD5withRSA、SHA1withRSA
        // Signature - 用于提供数字签名算法功能
        Signature sign = Signature.getInstance("SHA1withRSA");
        // 使用私钥初始化签名
        sign.initSign(prikey);
        byte[] dataBase= Base64.encodeBase64(dataString.getBytes());
        // 使用指定byte[]数组更新要签名或验证的数据
        sign.update(dataBase);
        // 返回已更新数据的签名byte[]数组
        byte[] signature = sign.sign();
        signatureString = new String(Base64.encodeBase64(signature));
        System.out.println("--------signature is : " + signatureString);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return signatureString;
}
/**
 * 读取cer并验证公钥签名
 */
public Boolean readCerAndVerifySign(String requsetBody, String signature) {
    String filePath=rootPath+CERPATH;
    X509Certificate cert = null;
    boolean flag = false;
    try {
        // CertificateFactory 用于从相关的编码中生成证书、证书路径、证书撤销列表对象
        // X.509 的 CertificateFactory 返回的证书必须是 java.security.cert.X509Certificate 的实例
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        // 从指定流中获取数据并生成证书
        cert = (X509Certificate) cf
                .generateCertificate(new FileInputStream(new File(
                        filePath)));
        // 获取公钥
        PublicKey publicKey = cert.getPublicKey();
        String publicKeyString = new String(Base64.encodeBase64(publicKey
                .getEncoded()));
        System.out.println("-----------------公钥--------------------");
        System.out.println(publicKeyString);
        System.out.println("-----------------公钥--------------------");
        // 签名算法
        Signature verifySign = Signature.getInstance("SHA1withRSA");
        // 使用给定证书的公钥初始化签名对象
        verifySign.initVerify(publicKey);
        // 用于验签的数据
        verifySign.update(requsetBody.getBytes());
        // 将获得的签名数据合公钥加签后的数据验证,获得验证则true,否则false
        flag = verifySign.verify(Base64.decodeBase64(signature));
        System.out.println("verifySign is " + flag);
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (SignatureException e) {
        e.printStackTrace();
    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return flag;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值