基本步骤

签名方:

1用sha1算出原文的摘要

2用私钥对摘要进行加密

3对密文进行BASE64编码


验证方:

1对密文进行BASE64解码

2用公钥对解码后的密文解密

3用sha1对原文计算摘要并和解密后的明文比对


上干货

//参数字符串
        String userId="2312sd";
        String orderId="232djfj";
        String price="12312";
        //用于签名和传输的字符串
        StringBuffer bufferStr =new StringBuffer();
        bufferStr.append("userId=").append(userId)
        .append("&orderId=").append(orderId)
        .append("&price=").append(price);
        //随机生成秘钥对
        //指定算法为RSA
        KeyPairGenerator  kpg =KeyPairGenerator.getInstance("RSA");
        //初始化
        kpg.initialize(1024);
        //获取秘钥对
        KeyPair keyPair =kpg.generateKeyPair();
        
        //数字签名开始
        //第一步,对原文进行sha1
        String localStr =bufferStr.toString();
        MessageDigest md =MessageDigest.getInstance("SHA");
        byte[] shaDigest=md.digest(localStr.getBytes("utf-8"));
        //第二部,使用私钥对原文进行加密
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        //ENCRYPT_MODE表示为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate());
        //加密
        byte[] rsaBytes = cipher.doFinal(shaDigest);
        //base64编码
        byte[] base64Str = Base64.getEncoder().encode(rsaBytes);
        String base64enCode=new String(base64Str);
        //签名加密完成数据传输到客户端
        
        //客户端验证签名开始
        //解码base64
        //获取原文
        String receiveStr=localStr;
        byte[] bese64Decoded =Base64.getDecoder().decode(base64enCode.getBytes());    
        //用公钥进行解密
        Cipher cipher2 = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher2.init(Cipher.DECRYPT_MODE, keyPair.getPublic());
        byte[] rsadecode= cipher2.doFinal(bese64Decoded);
        String sha1=Base64.getEncoder().encodeToString(rsadecode);
        String sha2=Base64.getEncoder().encodeToString(md.digest(receiveStr.getBytes("utf-8")));
        if(sha1.equals(sha2))
            System.out.println("验签成功");
        else
            System.out.println("验签失败");

说明:  这里只是简单的实现了在本地的单向签名,后面见陆续实现,双向签名,基于HTTPS的跨域签名验签。