话不多说,代码如下

 package com.syl.test_key;

 import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap; /**
* Created by 孙义朗 on 2017/11/24 0024.
*/
@Slf4j
public class KeyUtil {
public static final String KEY_ALGORTHM = "RSA";//
public static final String SIGNATURE_ALGORITHM = "SHA1WithRSA";
public static final String PUBLIC_KEY = "RSAPublicKey";//公钥
public static final String PRIVATE_KEY = "RSAPrivateKey";//私钥 //map对象中存放公私钥(初始化,生成一对公钥和私钥) 1
public static Map<String, Object> initKey() throws Exception {
//获得对象 KeyPairGenerator 参数 RSA 1024个字节
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORTHM);
keyPairGen.initialize(1024);
//通过对象 KeyPairGenerator 获取对象KeyPair
KeyPair keyPair = keyPairGen.generateKeyPair(); //通过对象 KeyPair 获取RSA公私钥对象RSAPublicKey RSAPrivateKey
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
//公私钥对象存入map中
Map<String, Object> keyMap = new HashMap<String, Object>(2);
keyMap.put(PUBLIC_KEY, publicKey);
keyMap.put(PRIVATE_KEY, privateKey);
return keyMap;
} /**
* 获得公钥 2
*/
public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
//获得map中的公钥对象 转为key对象
Key key = (Key) keyMap.get(PUBLIC_KEY);
//编码返回字符串 2.1
return encryptBASE64(key.getEncoded());
} //编码返回字符串 2.1(3.1)
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
} /**
* 获得私钥 3
*/
public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {
//获得map中的私钥对象 转为key对象
Key key = (Key) keyMap.get(PRIVATE_KEY);
//编码返回字符串 3.1
return encryptBASE64(key.getEncoded());
} /**
* 根据私钥,生成数字签名 4
*/
public static String getSign(TreeMap<String, Object> map, String privateKey) {
try {
log.info("****** privateKey : " + privateKey); //获取待签名的字符串 4.1
String result = getValue(map);
log.info("****** 参与签名的字符串为:[" + result + "]");
//信息加密,生成数字签名 4.2
return KeyUtil.sign(result.getBytes("utf-8"), privateKey);
} catch (Exception e) {
log.info("****** 签名异常", e);
return "";
}
} //获取待签名的字符串 4.1(5.1)
public static String getValue(TreeMap<String, Object> map) throws Exception {
log.info("****** 加签字符串:[" + map.toString() + "]");
map.remove("sign");// 移除上送上来的sign字段
StringBuilder sb = new StringBuilder();
Iterator<Map.Entry<String, Object>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, Object> entry = iter.next();
sb.append(entry.getValue() == null ? "" : entry.getValue());
}
String result = sb.toString(); return result;
} //用私钥对需要加密的信息加密 4.2
public static String sign(byte[] data, String privateKey) throws Exception {
//解密私钥
byte[] keyBytes = Base64.decodeBase64(privateKey);
//构造PKCS8EncodedKeySpec对象
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
//指定加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
//取私钥匙对象
PrivateKey privateKey2 = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
//用私钥对信息生成数字签名
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(privateKey2);
signature.update(data); return Base64.encodeBase64String(signature.sign());
} /**
* 用公钥,校验签名 5
*/
public static boolean vertifySign(TreeMap<String, Object> map, String sign, String publicKey) {
try {
log.info("****** publicKey : " + publicKey); //获取待校验的字符串 5.1
String result = getValue(map);
log.info("****** 参与验签的字符串为:[" + result + "]");
//校验数字签名 5.2
return KeyUtil.verify(result.getBytes("utf-8"), publicKey, sign);
} catch (UnsupportedEncodingException e) {
log.error("****** 校验签名异常", e);
return false;
} catch (Exception e) {
log.error("****** 校验签名异常", e);
return false;
}
} //校验数字签名(校验签名使用) 5.2
public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
//解密公钥
byte[] keyBytes = Base64.decodeBase64(publicKey);
//构造X509EncodedKeySpec对象
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
//指定加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
//取公钥匙对象
PublicKey publicKey2 = keyFactory.generatePublic(x509EncodedKeySpec); Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(publicKey2);
signature.update(data);
//验证签名是否正常
return signature.verify(Base64.decodeBase64(sign));
} //解码返回byte
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
} }

KeyUtil

测试类

 package com.syl.test_key;

 import java.util.Map;
import java.util.TreeMap; /**
* Created by 孙义朗 on 2017/11/24 0024.
*/
public class TestKey {
public static void main(String[] args) throws Exception {
//新建一个需要加签的信息
TreeMap<String, Object> treeMap = new TreeMap();
treeMap.put("name", "syl");
treeMap.put("age", 18); //map对象中存放公私钥
Map<String, Object> keyMap = KeyUtil.initKey(); //获得公钥和私钥
String publicKey = KeyUtil.getPublicKey(keyMap);
String privateKey = KeyUtil.getPrivateKey(keyMap); //获取签名
String sign = KeyUtil.getSign(treeMap, privateKey); //验证签名
boolean flag = KeyUtil.vertifySign(treeMap, sign, publicKey);
if (flag) {
System.out.println("验证成功!");
} else {
System.err.println("验证失败");
}
}
}

TestKey

控制台输出

java POST 传值 加签 验证的更多相关文章

  1. RSA体系 c++/java相互进行加签验签--转

    在web开发中,采用RSA公钥密钥体系自制ukey,文件证书登陆时,普遍的做法为:在浏览器端采用c++ activex控件,使用 c++的第三库openssl进行RAS加签操作,在服务器端采用java ...

  2. Java Http接口加签、验签操作方法

    1.业务背景 最近接触了一些电商业务,发现在处理电商业务接口时,比如淘宝.支付类接口,接口双方为了确保数据参数在传输过程中未经过篡改,都需要对接口数据进行加签,然后在接口服务器端对接口参数进行验签,确 ...

  3. Java实现RSA密钥对并在加解密、加签验签中应用的实例

    一.项目结构 二.代码具体实现 1.密钥对生成的两种方式:一种生成公钥私文件,一种生成公钥私串 KeyPairGenUtil.java package com.wangjinxiang.genkey. ...

  4. 记一次Java加密加签算法到php的坑

    此文为本人原创首发于 http://www.35coder.com/convert_encryption_codes_to_php/. 写代码的经历中,总少不了与外部的程序对接,一旦有这样的事,往往周 ...

  5. java RSA 加签验签【转】

    引用自: http://blog.csdn.net/wangqiuyun/article/details/42143957/ java RSA 加签验签 package com.testdemo.co ...

  6. Http请求加签、验证操作

    加签.验签的作用 常见的http请求交互过程中,请求参数通过url或者request body等形式传输.但是由于http请求的开放性,使得请求参数很容易被拦截篡改.因此,需要对请求参数进行加签,然后 ...

  7. iOS下使用SHA1WithRSA算法加签源码

    首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数 ...

  8. RSA加密解密及RSA加签验签

    RSA安全性应用场景说明 在刚接触RSA的时候,会混淆RSA加密解密和RSA加签验签的概念.简单来说加密解密是公钥加密私钥解密,持有公钥(多人持有)可以对数据加密,但是只有持有私钥(一人持有)才可以解 ...

  9. Java中常用加减密方式

    1.加密概述: 加密就是是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使以获得了加密的信息,但因不知解密方式,仍无法了解信息的内容.大体上又分为双向加密和单向加密. 2.单项加密 2.1.概 ...

随机推荐

  1. 给刚玩Hadoop的朋友一些建议

    随着两会中间央视新闻天天说大数据,很多人纷纷开始关注大数据和Hadoop以及数据挖掘和数据可视化了,我现在创业,遇到很多传统数据行业往Hadoop上面去转型的公司和个人,提了很多问题,大多数问题还都是 ...

  2. 也说AOP

    前言 1.引言 2.Aop概念 3.Aop实践 4.总结 一.引言 对于初入行的小白来讲,aop,ioc这两个程序设计思想总是傻傻分不清,不知道是个什么东东?别人再一谈各种框架更是云里雾里...博主今 ...

  3. C++&VS项目学习

    vs使用 C++项目中,Solution Explorer主要是逻辑视图(不对应文件的逻辑位置,没有文件夹只有Filter的概念.头文件源文件被自动分配到Header Files和Source Fil ...

  4. plsql连接oracle客户端(简单,实用方案)附件

    plsql 连接 oracle 需要在本地安装oracle客户端(附件中下载): 将文件下载下来后,放到任意目录,例如 D:\instantclient_10_2 修改 tnsnames.ora 文件 ...

  5. 当页面滚动到距顶部一定高度时某DIV自动隐藏和显示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. php面向对象编程_1

    1, php面向对象编程的三大特征: (1) 封装性,封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法)才能对数据进行操作. (2) 继承 ...

  7. SQLServer XML

    OPENXML 参见:OPENXML (SQL Server) | Microsoft Docs SQL For XML 参见:FOR XML (SQL Server) | Microsoft Doc ...

  8. iOS中的自由桥接

    [摘抄自<iOS 6编程实战>] 与Objective-C库不同,我们在Objective-C中使用标准C语言和Core Foundation类库(CF*方法)不会遵循那些命名约定.这意味 ...

  9. 方法引用(Method reference)和invokedynamic指令详细分析

    方法引用(Method reference)和invokedynamic指令详细分析 invokedynamic是jvm指令集里面最复杂的一条.本文将详细分析invokedynamic指令是如何实现方 ...

  10. 使用Git如何优雅的忽略掉一些不必的文件

    熟悉使用Git之后发现,使用sourceTree来管理和开发项目会变得更高效,现在我用bitbucket管理自己的项目,它提供了私有的仓库,用起来还是比较爽,不过刚开始用的时候,只要一打开本地仓库的工 ...