数字证书私钥sign及验证
package com.epay.bank.test.encrypt; import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Enumeration; import org.apache.log4j.Logger; import sun.misc.BASE64Encoder; public class TestNetpaySignature {
private static Logger logger = Logger.getLogger(TestNetpaySignature.class);
/**
* 根据原数据和指定的加密算法来生成用户的签名数据
*
* @param algorithm
* :使用的加密算法,为SHA1withRSA
* @param srcData
* :被签名数据,byte[]类型
* @param jksPath
* :商户私钥jks文件存放路径
* @param jksPath
* :商户私钥密码
* @return 已签名数据
* @throws Exception
*/
public byte[] sign(String algorithm, byte[] srcData, String jksPath,String jksPwd)
throws Exception { try {
// 获取JKS 服务器私有证书的私钥,取得标准的JKS的 KeyStore实例
KeyStore store = KeyStore.getInstance("JKS"); // 读取jks文件,path为商户私钥jks文件存放路径
FileInputStream stream = new FileInputStream(jksPath); // jks文件密码,根据实际情况修改
String passwd = jksPwd;
store.load(stream, passwd.toCharArray()); // 获取jks证书别名
Enumeration en = store.aliases();
String pName = null;
while (en.hasMoreElements()) {
String n = (String) en.nextElement();
if (store.isKeyEntry(n)) {
pName = n;
}
} // 获取证书的私钥
PrivateKey key = (PrivateKey) store.getKey(pName,
passwd.toCharArray()); // 进行签名服务
Signature signature = Signature.getInstance(algorithm);
signature.initSign(key);
signature.update(srcData);
byte[] signedData = signature.sign(); return signedData; } catch (Exception e) {
throw new Exception("signature.sign.error");
}
} public String getSignedStr(byte[] signedData){
logger.info("已签名" + new BASE64Encoder().encode(signedData));
// 返回签名结果
return new BASE64Encoder().encode(signedData);
} /**
* 根据对签名数据使用签名者的公钥来解密后验证是否与原数据相同。从而确认用户签名正确
*
* @param 使用的加密算法
* ,需与加密时使用的算法一致
* @param srcData
* 被签名数据,byte[]类型
* @param signedData
* 使用该用户的私钥生成的已签名数据
* @param path商户公钥证书cer文件存放路径
* @return true或false,验证成功为true。
* @throws Exception
*/ public boolean verify(String algorithm, byte[] srcData, byte[] signedData,
String path) throws Exception {
// 获取指定证书的公钥
CertificateFactory certInfo = CertificateFactory.getInstance("x.509");
X509Certificate cert = (X509Certificate) certInfo
.generateCertificate(new FileInputStream(path));
PublicKey publicKey = cert.getPublicKey(); // 进行验证签名服务
try {
Signature sign3 = Signature.getInstance(algorithm);
sign3.initVerify(publicKey);
sign3.update(srcData);
return sign3.verify(signedData);
} catch (Exception e) {
throw new Exception("signature.verify.error");
}
} public static void main(String[] args) {
StringBuffer srcData = new StringBuffer(); srcData.append("1"); TestNetpaySignature testNetpaySignature = new TestNetpaySignature(); boolean flag = false;
try {
byte[] signedData = testNetpaySignature.sign("SHA1withRSA", srcData.toString().getBytes(), "D:\\keystore\\pinganmer.jks", "12345678"); flag = testNetpaySignature.verify("SHA1withRSA", srcData.toString().getBytes(), signedData, "D:\\keystore\\pinganmer.cer"); } catch (Exception e) {
// TODO: handle exception
}
System.out.println(flag); }
}
数字证书私钥sign及验证的更多相关文章
- openssl数字证书私钥删除私钥密码
解密 openssl rsa -in server.key.org -out server.key
- 大话https演化过程(对称加密、非对称加密、公钥、私钥、数字签名、数字证书)
大话https演化过程(包括概念:对称加密.非对称加密.公钥.私钥.数字签名.数字证书.https访问全过程) 在网络上发送数据是非常不安全的,非常容易被劫持或是被篡改,所以每次定向发送数据你都可 ...
- 加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证
加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证 各角色比喻 客户端:通常为请求方,要验证服务器的身份. 服务器:通常为响应方,有时也要 ...
- 公钥与私钥对HTTPS的理解(数字证书的需要)
本文转自某大牛链接 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下window ...
- 几个例子理解对称加密与非对称加密、公钥与私钥、签名与验签、数字证书、HTTPS加密方式
# 原创,转载请留言联系 为什么会出现这么多加密啊,公钥私钥啊,签名啊这些东西呢?说到底还是保证双方通信的安全性与完整性.例如小明发一封表白邮件给小红,他总不希望给别人看见吧.而各种各样的技术就是为了 ...
- 公钥、私钥、数字签名、数字证书、对称与非对称算法、HTTPS
作者: yoyoso https://my.oschina.net/ioslighter/blog/359207 对公钥和私钥有点稀里糊涂的,搜索了一些资料,作一些整理吧,先看这个: 加密--公钥 看 ...
- 理解 HTTPS 工作原理(公钥、私钥、签名、数字证书、加密、认证)(转)
本文摘录参考: 细说 CA 和证书(主要讲解 CA 的使用) 数字签名是什么?(简单理解原理) 深入浅出 HTTPS 工作原理(深入理解原理) HTTP 协议由于是明文传送,所以存在三大风险: 1.被 ...
- 探究公钥、私钥、对称加密、非对称加密、hash加密、数字签名、数字证书、CA认证、https它们究竟是什么,它们分别解决了通信过程的哪些问题。
一.准备 1. 角色:小白.美美.小黑. 2. 剧情:小白和美美在谈恋爱:小黑对美美求而不得.心生怨念,所以从中作梗. 3. 需求:小白要与美美需通过网络进行通信,联络感情,所以必须保证通信的安全性. ...
- xamarin uwp数字证书公钥私钥
对于数字证书存储导入到电脑中,采用如下方式: /// <summary> /// 导入证书 /// </summary> /// <param name="ra ...
随机推荐
- C# 类的介绍,参数传递,各种符号说法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 查看真机的系统版本sdk
1.adb devices 确保连接上了真机 2.adb shell 进入android系统 3.进入system目录下 4.查看build.prop文件 cat build.prop
- monkey测试(转)
一.Monkey测试简介Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕.滑动Trackball.按键等操作来对设备上的程序进行压力测试,检测程序多久的时 ...
- 配置文件App.config的使用以及Readonly与Const的对比
以前我们学习的时候都把连接数据库的连接字符串写在一个类中,因为我们的数据库都在自己电脑上.如果更换数据库地址,需要更改这个类,然后重新编译才可以连接到数据库.现在我们需要将连接字符串当道一个文件中,然 ...
- HDU 3681 Prison Break(BFS+二分+状态压缩DP)
Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...
- Android 利用Service实现下载网络图片至sdk卡
package com.example.myapp5; import android.app.Activity; import android.content.Intent; import andro ...
- windows下gvim与gcc的一键环境的搭建
此处略去在windows中配置gcc的方法.默认你已经能够在命令提示符下直接使用gcc了. 其实就是写了一个vimscript的.vim文件,然后在 _vimrc 中使用source命令引用进来. 以 ...
- zw版_Halcon图像交换、数据格式、以及超级简单实用的DIY全内存计算.TXT
zw版_Halcon图像交换.数据格式.以及超级简单实用的DIY全内存计算.TXT Halcon由于效率和其他原因,内部图像采用了很多自有格式,提高运行速度,但在数据交换方面非常麻烦. 特别是基于co ...
- 【RoR win32】新rails运行后0.0.0.0:3000不能访问
在浏览器中使用127.0.0.1:3000来访问
- 学习K&R时初学者经常遇到的一个问题——EOF
学习K&R时初学者经常遇到的一个问题——EOF