Java实现 数字签名

  1. 生成 公钥 和私钥 对
public class KeyGenerater {
 private byte[] priKey;
 private byte[] pubKey;

 public void generater() {
  try {
   java.security.KeyPairGenerator keygen = java.security.KeyPairGenerator
     .getInstance("RSA");
   SecureRandom secrand = new SecureRandom();
   secrand.setSeed("syj".getBytes()); // 初始化随机产生器
   keygen.initialize(1024, secrand);
   KeyPair keys = keygen.genKeyPair();

   PublicKey pubkey = keys.getPublic();
   PrivateKey prikey = keys.getPrivate();

   pubKey = Base64.encodeToByte(pubkey.getEncoded());
   priKey = Base64.encodeToByte(prikey.getEncoded());

   System.out.println("pubKey = " + new String(pubKey));
   System.out.println("priKey = " + new String(priKey));
  } catch (java.lang.Exception e) {
   System.out.println("生成密钥对失败");
   e.printStackTrace();
  }
 }

 public byte[] getPriKey() {
  return priKey;
 }

 public byte[] getPubKey() {
  return pubKey;
 }
}

2. 加密过程(数字签名):利用私钥对传输数据进行数据加密

public class Signaturer {
 /**
  * 
  * Description:数字签名
  * 
  * @param priKeyText
  * @param plainText
  * @return  
  */
 public static byte[] sign(byte[] priKeyText, String plainText) {
  try {
   PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64
     .decode(priKeyText));
   KeyFactory keyf = KeyFactory.getInstance("RSA");
   PrivateKey prikey = keyf.generatePrivate(priPKCS8);

   // 用私钥对信息生成数字签名
   java.security.Signature signet = java.security.Signature
     .getInstance("MD5withRSA");
   signet.initSign(prikey);
   signet.update(plainText.getBytes());
   byte[] signed = Base64.encodeToByte(signet.sign());
   return signed;
  } catch (java.lang.Exception e) {
   System.out.println("签名失败");
   e.printStackTrace();
  }
  return null;
 }
}

3. 校验数字签名, 利用公钥和数据明文进行编码校验 ”数据字签名“的数据 Check。

public class SignProvider {
 private SignProvider() {

 }

 /**
  * 
  * Description:校验数字签名,此方法不会抛出任务异常,成功返回true,失败返回false,要求全部参数不能为空
  * 
  * @param pubKeyText
  *            公钥,base64编码
  * @param plainText
  *            明文
  * @param signTest
  *            数字签名的密文,base64编码
  * @return 校验成功返回true 失败返回false  
  */
 public static boolean verify(byte[] pubKeyText, String plainText,
   byte[] signText) {
  try {
   // 解密由base64编码的公钥,并构造X509EncodedKeySpec对象
   java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(
     Base64.decode(pubKeyText));
   // RSA对称加密算法
   java.security.KeyFactory keyFactory = java.security.KeyFactory
     .getInstance("RSA");
   // 取公钥匙对象
   java.security.PublicKey pubKey = keyFactory
     .generatePublic(bobPubKeySpec);
   // 解密由base64编码的数字签名
   byte[] signed = Base64.decode(signText);
   java.security.Signature signatureChecker = java.security.Signature
     .getInstance("MD5withRSA");
   signatureChecker.initVerify(pubKey);
   signatureChecker.update(plainText.getBytes());
   // 验证签名是否正常
   if (signatureChecker.verify(signed))
    return true;
   else
    return false;
  } catch (Throwable e) {
   System.out.println("校验签名失败");
   e.printStackTrace();
   return false;
  }
 }
}
时间: 2024-10-06 20:59:17

Java实现 数字签名的相关文章

JAVA RSA 数字签名

import java.security.KeyPair; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; public class GenerateKeyPair { private String priKey; private String pubKey; public void run() { try { java.security.Key

Java 数字签名原理及产生

数字签名与数字证书 关于数字签名的介绍可以参考以上这篇. 这里稍微说一下不对称加密的方式: 用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密. 这样比对称加密更安全 Java 中数字签名的方式 跟普通文本加密的原理是一样的. Java 数字签名和数字证书的作用 毋庸置疑,这些都是为了安全性而考虑的. 比如对于applet 来说,它可以保护用户(客户端) 文件和私人数据不被恶意的程序或病毒感染和破坏,鉴别代码提供者的身份.对于开发者而言,通过使用API方法,能够将安全性功能集成到应用

160829、Java加解密与数字签名

** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二.消息摘要算法加密————主要用于验证数据完整性. MD(消息摘要): SHA(安全散列) JDK实现和MD一样. BC实现如下:(Digest类) CC实现最简单(就是一个DigestUtils的静态方法): MAC(消息认证码)——含有密钥的散列函数算法 兼容MD和SHA的特性,但加入了密钥.

Java安全之数字签名

数字签名能够验证数据完整性.认证数据来源,并起到抗否认的作用,这3点与OSI参考模型中的数据完整性服务.认证(鉴别)服务和抗否认性服务相对应.消息摘要算法是验证数据完整性的最佳算法,因此,该算法成为数字签名中的必要组成部分. 基于数据完整性验证,我们希望数据的发送方可以对自己所发送的数据做相应的签名处理,同时给出对应的凭证(签名),并且数据的接收方可以验证该签名是否与数据发送方发送的数据相符.如何任何人都可以进行签名处理,那么签名就失去了验证的意义.所以,签名操作只能是由数据发送方来完成,而验证

一个基于RSA算法的Java数字签名例子

原文地址:一个基于RSA算法的Java数字签名例子 一.前言: 网络数据安全包括数据的本身的安全性.数据的完整性(防止篡改).数据来源的不可否认性等要素.对数据采用加密算法加密可以保证数据本身的安全性,利用消息摘要可以保证数据的完整性,但是还有一点就是数据来源的不可否认性(也就是数据来自哪里接收者是清楚的,而且发送数据者不可抵赖). 有些方案曾经使用消息认证码(MAC)来保证数据来源于合法的发送着,但是利用消息认证码会带来一个问题,就是通讯双方必须事先约定两者之间的通讯用共享密码.在我们的互联网

Java details from Java核心技术 卷1 基础知识(1)

Java是一种包括语言.虚拟机.即时编译.类库.执行环境的平台: 执行环境提供安全性.跨操作系统的可移植性.自动垃圾收集等服务: 设计初衷:简单性.面向对象.网络技能.健壮性.安全性.体系结构中立.可移植性.解释型.高性能.多线程.动态性 简单性:Java剔除了C++中的:头文件.指针运算(甚至指针语法).结构.联合.操作符重载.虚基类等: 面向对象:一种程序设计技术.C++多继承:Java单继承+接口.Java中元类模型(metaclass): 网络技能:Java应用程序能够通过URL打开和访

使用数字签名实现数据库记录防篡改(Java实现)

本文大纲 一.提出问题 二.数字签名 三.实现步骤 四.参考代码 五.后记 六.参考资料 一.提出问题 最近在做一个项目,需要对一个现成的产品的数据库进行操作,增加额外的功能.为此,需要对该产品对数据库有什么操作进行研究(至于怎么监控一个产品的操作会引发什么数据库操作,以后会详细解说).本来已经对数据库的操作了如指掌的,无意中发现数据库表里的每条记录都会有这样一个字段: 这感觉不妙了,字段名叫signature,顾名思义,就是签名的意思呀.难道数据库表中的每条记录都会有签名?也就是说如果我不能正

[Java 安全]加密、解密与数字签名

引言 本文使用的密码学术语请见术语章节. Base64编码 算法简述 定义 Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别. Base64是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的ASCII字符序列,常用在需用通过文本协议(比如HTTP和SMTP)来传输二进制数据的情况下.Base64并不是加密解密算法,尽管我们有时也听到使用Base64来加密解密的说法,但这里所说的加密与解密实际是指编码(encode)和解码(decode)的过程,其

java-信息安全(十三)-数字签名,代码签名【Java证书体系实现】

概述 信息安全基本概念 前置 java-信息安全(十二)-数字签名[Java证书体系实现] 过程 通过工具JarSigner可以完成代码签名.  这里我们对tools.jar做代码签名,命令如下: 进入D盘下 jarsigner -storetype jks -keystore zlex.keystore -verbose tools.jar www.zlex.org 输出 输入密钥库的口令短语: 正在更新: META-INF/WWW_ZLEX.SF 正在更新: META-INF/WWW_ZLE