非对称加密 签名算法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/bestcxx/article/details/100081222

前言

体能状态先于精神状态,习惯先于决心,聚焦先于喜好。

非对称签名 算法

常用的有 SHA1withRSA、SHA256withRSA、SHA1withDSA
即先使用SHA(参考 SHA 安全散列算法)生成hash值,然后使用非对称加密的私钥对指定格式的字符串进行加密,将加密值传递连同参与签名的其他内容传递给接收方,接收方自己计算SHA值,然后对验签进行解密,比较SHA值是否相等,相等即表示内容没有被篡改。

Java 源码中

<a href="{@docRoot}/../technotes/guides/security/StandardNames.html#Signature">

RSA 签名

RSA签名:签名就是在这份资料后面增加一段强而有力的证明,以此证明这段信息的发布者和这段信息的有效性完整性。RSA签名常用的就是将这份信息进行hash,得到一个hash值,再将hash值加密作为签名,后缀在信息的末尾。接收方接到传输的资料后,使用私钥解密这段加密过的hash,得到hash值,然后对信息原文进行hash,对比两次hash是否一致(验签)。签名的过程是不可逆的,因为hash是不可逆的,毕竟那么大的文件被hash成一段字符串还能还原的话那就碉堡了。

非对称签名工具类

Java 支持多种非对称加密签名算法,工具类地址
非对称加密验签工具类

测试
  //下面提供一个 SHA1withRSA 的签名和验证例子
    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException, UnsupportedEncodingException {
        //RSA 1024 私钥
        String privateBase64Str="MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBALfXBP15PeOBS0h20hXZtIyeKiWx9py+VWagxfY2QvWH/+wu8xMpt0WFNWG6nS3ju9u2cViRQUYjRD5kz8hpRy8NdVoV/kbkZeK3LUqZs5/cb378uQTO3LWfOQJFBMz6ll2CXWEjEHGdxzj6iRjFYoC4VS+DDTGO+6iHmYSpP3/1AgMBAAECgYB94VqGYZ1yCZdOACZsVczeOHLtqsUNoPqDMnU62P7SdxRTWfaRWZAnp0XdLFXyFS0ODgfguF10tDNHceog9Y2KS3fHJK3JIur1Y55BqKzLlQlrAWpziaigEw+xJqiO+U67gomlCLTS6kYhFvPGXip3wOctvEh8yG1RX3exTmiVwQJBAPlWm6Aok86vHsBS8Znev1VV9nsSexrJXXkkdHv2ux2JSwQi/WNwWloolUtHFCGcyVmhNEmB7sSbR7/hmaKhiNECQQC8wGySaQIessawFnN/i+xmdoO0OeLCaR9MEce3B5dfRlTq37cfCbGCGnhSi5iRzx4/PHJGNoLPP2xFTVZ5VY3lAkA2rsTgwiVwbb2bxlUQPubNa1XsNehjvofOeq1FRp5Q4vxdwuK5fTmDjmT3pnYGzSDnlFAoUuOvoLKCpZKRNUYRAkALj4WW2hOlKbH9qwJb94f9JpkeesUmvyWJlTU0QqTE0xv0XstqfT+ABnsEI0Su+Y6StPMS1dfhNbM982Sufcz5AkB8OC1vMSQ0oYKxgS3nvNyNlTEjcveJALQAgU7vpSiA0/5LdwUFb7gCKQDL6pq8ySbZ4NV/U5xDVoBzsa5AIEVK";
        //RSA 1024 公钥
        String publicBase64Str="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC31wT9eT3jgUtIdtIV2bSMniolsfacvlVmoMX2NkL1h//sLvMTKbdFhTVhup0t47vbtnFYkUFGI0Q+ZM/IaUcvDXVaFf5G5GXity1KmbOf3G9+/LkEzty1nzkCRQTM+pZdgl1hIxBxncc4+okYxWKAuFUvgw0xjvuoh5mEqT9/9QIDAQAB";

        //非对称加密算法,如 RSA
        String algorithm="RSA";
        //非对称加密验签规则
        String sign_algorithm="SHA1withRSA";
        //待加密字符串:
        String str="method=info.auth#app_id=2138&sign_type=RSA&timestamp=2013-01-0108:08:08";
        //字符编码 方式
        String charset="utf8";

        //获取私钥
        PrivateKey privateKey=AsymmetricEncryptionUtil.restorePrivateKey(privateBase64Str,algorithm,charset);
        //获取公钥
        PublicKey publicKey=AsymmetricEncryptionUtil.restorePublicKey(publicBase64Str,algorithm,charset);

        //使用私钥计算签名
        String signStr=signatureSign(sign_algorithm,charset,str,privateKey);
        System.out.println("signStr="+signStr);

        //使用公钥验证签名
        System.out.println(signatureVerify(sign_algorithm,charset,str,signStr,publicKey));


    }

非对称加密签名在支付宝中的应用

支付宝的签名规则使用了SHA结合 RSA
SHA1已经不安全了,推荐使用 SHA256

开放平台签名算法名称 标准签名算法名称 备注
RSA2 SHA256WithRSA 强制要求 RSA 密钥的长度至少为 2048
RSA SHA1WithRSA 对 RSA 密钥的长度不限制,推荐使用 2048 位以上

支付宝开放平台提供了秘钥生成和校验工具

工具使用说明
https://www.hellojava.com/a/25619.html

  • WINDOWS:http://p.tb.cn/rmsportal_6680_secret_key_tools_RSA_win.zip
  • MAC_OSX:http://p.tb.cn/rmsportal_6680_secret_key_tools_RSA_macosx.zip

官方地址

https://docs.open.alipay.com/291/106115

参考

[1]、https://www.jianshu.com/p/c7d09ed656b1

猜你喜欢

转载自blog.csdn.net/bestcxx/article/details/100081222