-
2019-08-01 17:03:48
https://my.oschina.net/KelinM/blog/1925209
https://blog.csdn.net/u010096717/article/details/84558463
https://blog.csdn.net/ma_jiang/article/details/53636840
https://blog.csdn.net/qq_18495465/article/details/79248608
import org.springframework.util.StringUtils; import java.util.Map; import java.util.Random; import java.util.TreeMap; /** * @Author: JCccc * @CreateTime: 2018-10-30 * @Description: */ public class SignUtils { public String getTimestamp() { //生成时间戳 long timestampLong =System.currentTimeMillis(); String timestampStr = String.valueOf(timestampLong); return timestampStr; } public String getNonceStr(int length){ //生成随机字符串 String str="zxcvbnmlkjhgfdsaqwertyuiopQWERTYUIOPASDFGHJKLZXCVBNM1234567890"; Random random=new Random(); StringBuffer randomStr=new StringBuffer(); // 设置生成字符串的长度,用于循环 for(int i=0; i<length; ++i){ //从62个的数字或字母中选择 int number=random.nextInt(62); //将产生的数字通过length次承载到sb中 randomStr.append(str.charAt(number)); } //将承载的字符转换成字符串 return randomStr.toString(); } //类似微信接口的签名生成方法 public String createSign(Map<String, String> params, String privateKey){ StringBuilder sb = new StringBuilder(); // 将参数以参数名的字典升序排序 Map<String, String> sortParams = new TreeMap<String, String>(params); // 遍历排序的字典,并拼接"key=value"格式 for (Map.Entry<String, String> entry : sortParams.entrySet()) { String key = entry.getKey(); String value = entry.getValue().trim(); if (!StringUtils.isEmpty(value)) sb.append("&").append(key).append("=").append(value); } String stringA = sb.toString().replaceFirst("&",""); //String stringSignTemp = stringA + "&"+"appkey="+privateKey; //将签名使用MD5加密并全部字母变为大写 // String signValue = Md5Encrypt.md5(stringSignTemp).toUpperCase(); // System.out.println("stringA+privateKey后MD5加密+转换全部大写生成sign为: "+signValue); return stringA ; } }
package com.awj.mall.restfulapi.common.util; import java.util.*; import javax.servlet.http.HttpServletRequest; import com.google.common.collect.Maps; import com.awj.mall.restfulapi.modular.base.interceptor.AuthInterceptor; /** * Request请求的工具类 * @author Administrator * */ public class RequestUtil { /** * 获取ip * @param request * @return */ public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } public static String getURI(HttpServletRequest request){ return request.getRequestURI(); } public static String getURL(HttpServletRequest request){ return request.getRequestURL().toString(); } /** * 获取key值获取request中的value * * @param request * @param key * @return */ public static String getParam(HttpServletRequest request,String key){ return request.getParameter(key); } /** * @Author: hanweisheng * @Description: 获取request请求的map * @method: * @params: * @Date: Created in 2018/4/13 14:21 */ public static Map<String, String> getRequestMap(HttpServletRequest req) { Map<String, String> params = Maps.newHashMap(); Map<String, String[]> requestParams = req.getParameterMap(); for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = iter.next(); String[] values = requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } params.put(name, valueStr); } return params; } public static String getRequestStr(HttpServletRequest req, String excludeStr) { StringBuffer buffer = new StringBuffer(); Map<String, String[]> requestParams = req.getParameterMap(); for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = iter.next(); if (name.equals(excludeStr)) { continue; } String[] values = requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } buffer.append(name).append("=").append(valueStr).append("&"); } if (buffer.length() > 0) { buffer.deleteCharAt(buffer.length() - 1); } return buffer.toString(); } public static String getOrderRequestStr(HttpServletRequest req, String excludeStr){ List<String> list = new ArrayList<String>(); Map<String, String[]> requestParams = req.getParameterMap(); for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = iter.next(); if (name.equals(excludeStr)) { continue; } String[] values = requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } list.add(name+"="+valueStr); } StringBuffer buffer = new StringBuffer(); if(list.size()>0){ Collections.sort(list); for (int i = 0; i <list.size() ; i++) { buffer .append( (i == list.size() - 1) ? list.get(i) : list.get(i) + "&"); } } return buffer.toString(); } public static String getOrderStr(Map<String,String> map, String excludeStr){ List<String> list = new ArrayList<String>(); for (Iterator<String> iter = map.keySet().iterator(); iter.hasNext();) { String name = iter.next(); if (name.equals(excludeStr)) { continue; } String value = map.get(name); list.add(name+"="+value); } StringBuffer buffer = new StringBuffer(); if(list.size()>0){ Collections.sort(list); for (int i = 0; i <list.size() ; i++) { buffer .append( (i == list.size() - 1) ? list.get(i) : list.get(i) + "&"); } } return buffer.toString(); } public static String getUriPath(HttpServletRequest req) { String uri = req.getRequestURI(); String contextPath = req.getServletContext().getContextPath(); if (!StringUtils.isEmpty(contextPath)) { uri = uri.replaceFirst(contextPath, ""); } return uri; } }
更多相关内容 -
java简单实现验证签名.zip
2021-12-31 10:55:37java简单实现验证签名 -
验证签名机制——java示例
2021-02-12 14:14:38import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;import java.security.Signature;/**** @since 2015年8月20日 下午2:22:08* @author hym*/...import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.Signature;
/**
*
* @since 2015年8月20日 下午2:22:08
* @author hym
*/
public class SignDemo {
/**得到产生的私钥/公钥对
* @return
* @author hym
*/
public static KeyPair getKeypair(){
//产生RSA密钥对(myKeyPair)
KeyPairGenerator myKeyGen = null;
try {
myKeyGen = KeyPairGenerator.getInstance("RSA");
myKeyGen.initialize(1024);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
KeyPair myKeyPair = myKeyGen.generateKeyPair();
return myKeyPair;
}
/**根据密钥对对信息进行加密,返回公钥值
* @param mySig
* @param myKeyPair
* @param infomation
* @return
* @author hym
*/
public static byte[] getpublicByKeypair(Signature mySig,KeyPair myKeyPair,byte[] infomation){
byte[] publicInfo=null;
try {
mySig.initSign(myKeyPair.getPrivate()); //用私钥初始化签名对象
mySig.update(infomation); //将待签名的数据传送给签名对象
publicInfo = mySig.sign(); //返回签名结果字节数组
} catch (Exception e) {
e.printStackTrace();
}
return publicInfo;
}
/**公钥验证签名
* @param mySig
* @param myKeyPair
* @param infomation
* @param publicInfo
* @return
* @author hym
*/
public static boolean decryptBypublic(Signature mySig, KeyPair myKeyPair,String infomation,byte[] publicInfo){
boolean verify=false;
try {
mySig.initVerify(myKeyPair.getPublic()); //使用公钥初始化签名对象,用于验证签名
mySig.update(infomation.getBytes()); //更新签名内容
verify= mySig.verify(publicInfo); //得到验证结果
} catch (Exception e) {
e.printStackTrace();
}
return verify;
}
public static void main(String[] args) {
try {
KeyPair keyPair=getKeypair();
Signature mySig = Signature.getInstance("MD5WithRSA");//用指定算法产生签名对象
byte[] publicinfo=getpublicByKeypair(mySig,keyPair,"验证我".getBytes());
boolean verify=decryptBypublic(mySig, keyPair, "验证我", publicinfo);
System.out.println("验证签名的结果是:"+verify);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
-
Java 数字签名和验证
2012-04-16 00:51:43Java语言的数字签名和认证实现代码。包括RSA签名认证、DSA、ECC三种签名认证方式。 -
java生成及验证android签名文件源码及生成签名文件
2018-09-05 16:05:25此文件包含生成android签名文件keystore及验证的源码还包含生成的keystore文件。放到项目中即可使用 -
java遇到微信小程序 "支付验证签名失败" 问题解决
2020-10-15 20:51:23主要介绍了java遇到微信小程序 "支付验证签名失败" 问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
Java代码实现数字签名验证
2021-01-28 13:47:21工作中经常需要发送重要...下面代码是生成数字签名和验证签名的实现过程,需要用到公钥和私钥,如果不知道怎么获取私钥和公钥请参考获取公钥和私钥 import java.io.File; import java.io.IOException; import java.nio.工作中经常需要发送重要的文件,为了防止文件信息泄露,我们会对文件进行加密,并加上签名验证,防止信息被篡改
加密是为了防止信息被泄露,而签名是为了防止信息被篡改
数字签名:公钥数字签名,只有信息的发送者,才能产生别人无法伪造的一段数字串,类似于写在纸上面的普通物理签名
下面代码是生成数字签名和验证签名的实现过程,需要用到公钥和私钥,如果不知道怎么获取私钥和公钥请参考获取公钥和私钥
import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import javax.crypto.Cipher; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; public class AsymmetricEncryption { public static void main(String[] args) throws Exception{ String input="123"; String algorithm="RSA";//加密算法 //读取私钥 PrivateKey privateKey = getPrivateKey("a.pri", algorithm); //读取公钥 PublicKey publicKey = getPublicKey("a.pub", algorithm); //获取数字签名 String signaturedData=getSignature(input, "sha256withrsa", privateKey); System.out.println("数字签名:"+signaturedData); //校验签名 boolean b=verifySignature(input,"sha256withrsa",publicKey,signaturedData); System.out.println("校验签名:"+b); } /** * 生成数字签名 * @param input 原文 * @param algorithm 算法 * @param privateKey 私钥 * @return * @throws Exception */ private static String getSignature(String input,String algorithm,PrivateKey privateKey) throws Exception { //获取签名对象 Signature signature=Signature.getInstance(algorithm); //初始化签名 signature.initSign(privateKey); //传入原文 signature.update(input.getBytes()); //开始签名 byte[] sign=signature.sign(); //使用base64进行编码 return Base64.encodeBase64String(sign); } /** * 校验签名 * @param input 原文 * @param algorithm 算法 * @param publicKey 公钥 * @param signaturedData 数字签名 * @return * @throws Exception */ private static Boolean verifySignature(String input,String algorithm,PublicKey publicKey,String signaturedData) throws Exception{ //获取签名对象 Signature signature=Signature.getInstance(algorithm); //初始化校验 signature.initVerify(publicKey); //传入原文 signature.update(input.getBytes()); //校验数据 return signature.verify(Base64.decodeBase64(signaturedData)); } }
欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感谢。如果觉得本文章有帮助到的,点个赞呗,让更多的阅读者看到
-
java遇到微信小程序 “支付验证签名失败” 问题解决
2021-01-03 06:30:33最近在做一个微信小程序项目做到微信支付的时候遇到的一些问题! 详细步骤: 开发前准备(必须) 小程序标识(appid):wx4d4838ebec29b8** 商户号(mch_id):15508070** 商户密钥(key) :wHtQckdfiRBVF7... -
JAVA版微信小程序用户数据的签名验证和加解密
2021-03-29 17:43:18签名验证和加解密 数据签名校验 为了确保 开放接口 返回用户数据的安全性,微信会对明文数据进行签名。开发者可以根据业务需要对数据包进行签名校验,确保数据的完整性。 签名校验算法涉及用户的session_key,通过 ... -
java签名与验签
2021-03-06 05:38:26基本概念:加密解密(可以采用对称加密或者非对称加密,详细加密算法 可以查看我的另外一个分类:【java加密】)加密:发送方利用接收方的公钥对要发送的明文进行加密。解密:接收方利用自己的私钥进行解密。公钥和私钥...基本概念:
加密解密(可以采用对称加密或者非对称加密,详细加密算法 可以查看我的另外一个分类:【java加密】)
加密:发送方利用接收方的公钥对要发送的明文进行加密。
解密:接收方利用自己的私钥进行解密。
公钥和私钥配对的,用公钥加密的文件,只有对应的私钥才能解密。当然也可以反过来,用私钥加密,用对应的公钥进行解密。
签名验签
签名:发送方从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,得到的就是这个报文对应的数字签名。
通常来说,发送方会把数字签名和报文原文一并发送给接受者。
验签:接收方得到原始报文和数字签名后,从报文中生成摘要A,另外,用发送方提供的公钥对数字签名进行解密,得到摘要B,对比A和B是否相同,就可以
得知报文有没有被篡改过。
作用:
数字签名有两种功效:一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。二是数字签名能确定消息的完整性。
发送方用自己的私钥完成数字签名,然后再用接收方的公钥对报文进行加密,将数字签名和报文传送给接收方。
接收方在拿到密文和数字签名后,先用自己的私钥对密文进行解密,得到明文,然后再用发送方提供的公钥进行验签,确保发送方身份的准确性,以及报文并没有被篡改过。
-
java实现签名验签
2021-01-02 11:18:41文章目录数字签名摘要算法消息摘要定义特点原理常用算法代码案例 数字签名 一般地,把对一个信息的摘要称为该消息的指纹或数字签名 任何一个公钥密码体制都可以单独地作为一种数字签名方案使用。 摘要算法 几乎所有... -
java数字签名(签名生成,用证书验证签名)
2013-06-09 15:27:14证书(Certificate,也称public-key certificate)是用某种签名算法对某些内容(比如公钥)进行数字签名后得到的、可以用来当成信任关系中介的数字凭证。证书发行机构通过发行证书 告知证书使用者或实体其公钥(public-... -
Java PDF 添加数字签名的实现方法
2020-08-25 05:38:00主要介绍了Java PDF 添加数字签名的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
java 国密算法实现包含SM2 SM3 SM4和数字签名、数字证书的验证
2019-05-05 14:16:25java 国密算法实现,包含SM2 SM3 SM4和数字签名、数字证书的验证以及相应的说明文档 -
手把手教你使用java对接微信公众号-签名验证
2020-08-20 15:34:09charset=utf-8") @ApiOperation(value = "验证消息的确来自微信服务器,签名验证", notes = "验证消息的确来自微信服务器,签名验证", code = 200, produces = "application/json") @ApiImplicitParams({ @... -
API接签名验证
2018-08-01 09:49:59http Restful API接签名验证 ,防API接口进行在公网裸奔 -
使用JAVA实现签名验证示例程序详解
2021-02-25 20:06:46使用JAVA实现签名验证示例程序程序来源于CSDN资源,我测试了一下,现在拿出来分享。import java.security.*;public class SignatureExample {public static void main(String[] args){try{byte[] info ="待签名信息... -
java RSA2 加密、解密 、签名和验证签名
2020-05-14 17:24:58} //公钥验证签名 base64签名 signature 签名内容requestData public static boolean verifySign(String requestData, String signature){ boolean verifySignSuccess = false; try { PublicKey publicKey = ... -
java 数字签名工具类.zip
2020-01-19 15:42:44用java 对文件进行签名验证的工具类,根据加密算法,把想要数字签名的文件传入,可自定义添加一些识别记号,返回该文件,再用工具类进行签名,之后再用返回后的文件跟生成的签名备份的文件进行比对,验证签名,以实现文件... -
java数字签名(签名生成,用证书验证签名)[汇编].pdf
2021-10-19 15:09:19java数字签名(签名生成,用证书验证签名)[汇编].pdf -
java数字签名(签名生成,用证书验证签名)[定义].pdf
2021-10-11 03:35:47java数字签名(签名生成,用证书验证签名)[定义].pdf -
java签名源码-ApkSignatureKiller:一键破解APK签名校验
2021-06-05 14:09:21java签名源码 一键破解APK签名校验 参考自,在其基础上进行了部分改进,并用纯 Java 实现。 原理 通过插入代码到 Application 入口,hook 了程序中 PackageManager 的 getPackageInfo 方法,改变了其获取到的签名... -
RSA公钥验证签名(Java版)
2021-03-30 09:27:02RSA签名验证,使用公钥验证签名是否正确,含SHA1,SHA256 需要依赖commons-codec <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <... -
Java 数字签名、数字证书生成
2021-03-16 07:08:27产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥验证签名结果,... -
如何使用Java 验证以太坊钱包签名?
2021-08-25 22:45:06如何使用Java 验证以太坊钱包签名? 场景 在dapp应用中需要用户进行签名某个文本,后台验证这个文本来源于这个账号,然后进行对应的登录操作,返回于服务器交互的token。 代码 js前端钱包工具类 import {ethers,... -
国密签名验证demo
2020-09-28 17:30:44近期公司需要使用国密算法,弄了个国密算法加密验签的demo,window版带dll文件。RAS算法,GM -
Java 生成证书的数字签名.rar
2019-07-10 11:46:15//使用公钥初始化签名对象,用于验证签名 mySig.update(info); //更新签名内容 boolean verify= mySig.verify(sigResult); //得到验证结果 System.out.println( "签名验证结果: " verify); -
积分java源码-SiVa:签名验证服务
2021-06-06 19:28:45签名验证服务 SiVa 是数字签名验证 Web 服务,提供 JSON 和 SOAP API 以验证以下文件类型: 爱沙尼亚 DDOC 集装箱 带有 TimeMark 和 TimeStamp 签名的爱沙尼亚 BDOC 容器 爱沙尼亚 X-Road 安全服务器 ASICE 签名容器... -
项目级Java接口签名与验证实现
2020-06-05 16:36:13在一些项目中,客户端在调用服务的接口时,通常需要设置签名验证,以保证对客户端的认证。在签名过程中一般每个公司都有自己的签名规则和签名算法,广泛使用的是使用非对称加密算法RSA为核心,在客户端使用私钥对...