数字证书私钥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 ...
随机推荐
- 转:Python requests 快速入门
迫不及待了吗?本页内容为如何入门Requests提供了很好的指引.其假设你已经安装了Requests.如果还没有, 去 安装 一节看看吧. 首先,确认一下: ·Requests 已安装 ·Reques ...
- table创建固定表头
布局:两个div,上部内容将表头复制,高度固定,下部div内部将table设置为margin:-**px; 隐藏掉表头,下部div设置overflow,即可. 代码:
- 20145207《Java程序设计》第7周学习总结
教材学习内容总结 一.Lambda -使用Lambda的特性可以去除重复的信息,以取得语法的简洁,增加程序代码的表达性.Lambda表达式本身是中性的,不代表任何类型的实例,同样的Lambda表达式, ...
- poj: 2262
简单题 #include <iostream> #include <stdio.h> #include <string> #include <stack> ...
- Android中使用ShareSDK实现分享
1,在http://www.mob.com官网上去创建一个后台应用(如果没有账号的同学要去先注册一下),主要后去的是你新创建的应用的appKey值 2,这里我们分享新浪微博为例,在新浪微博的sdk中创 ...
- paper 20 :color moments
图像的颜色特征是很重要的,其中颜色矩也是很重要的一部分.(还有一个关于图像颜色特征的review,对于image color写的比较全面).还有,我要强调一下,本blog上的链接都是Google学术上 ...
- openssh设置免密码登录远程服务器
主机 host | 远程机器 server 目标:从host登录到server,免密码输入 host机器: ssh-keygen -t rsa 在~/.ssh/中会生成两个文件 id_rsa.pub和 ...
- 夺命雷公狗—angularjs—17—angularjs的静态库
在实际的开发中我们往往已经离不开我们的静态库了,因为那里面有太多强悍的功能了,比如路由都是通过一个angular-route的库来实现的,, 那个库,我们可以在百度静态资源公共库来查找,查找方法如下所 ...
- 安装VirtalBox虚拟机的一些问题归纳
1.分别下载VirtalBox软件和镜像,进行安装出现一个问题:换了一个.dll动态库,用管理员权限运行修改BIOS 中Intel Virtual Technology Enabled!2.功能:虚拟 ...
- 在Debian下安装ibus输入法
sudo apt-get install ibus ibus-pinyin im-switch sudo apt-get install ibus-googlepinyin im-switch -s ...