java加密与数字证书

加密与数字证书


概念

数字摘要

数字摘要就是采用单项Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密文,这一串密文又称为数字指纹,HASH值或摘要值 ,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。

目前常用的摘要算法为MD5、SHA1、SHA256等。其中MD5系列算法已经破解,一般不再建议使用。
MD5:Message-Digest Algorithm 5;
SHA1:Secure Hash Algorithm;

密钥加密技术

以用钥匙锁门为例,钥匙我们可以看做密钥,锁门的过程可以看做加密过程,锁门过程中所用到的原理就是加密算法

私用密钥(对称加密)

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。它的最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难。

公共密钥(非对称加密)

使用不同的密钥来分别完成加密和解密操作,一个公开发布,即公开密钥,另一个由用户自己秘密保存,即私用密钥。信息发送者用公开密钥去加密,而信息接收者则用私用密钥去解密。公钥机制灵活,但加密和解密速度却比对称密钥加密慢得多。

非对称加密的典型应用是数字签名,加密密钥。

数字签名

数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。

签名过程:发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方。

验签过程:接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公用密钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该数字签名是发送方的。

数字签名有两种功效:一是能确定消息确实是由发送方签名并发出来的;二是数字签名能确定消息的完整性。

数字签名是非对称密钥加密技术与数字摘要技术的应用。

下面是欧姆社系列图书《漫画密码》截图


数字证书

数字证书提供了一种在Internet上验证通信实体身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由权威机构CA发行,人们可以在网上用它来识别对方的身份。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名,此外,数字证书只在特定的时间段内有效。
数字证书是一个经证书授权中心数字签名的包含公钥拥有者信息以及公钥的文件。

X.509标准

X.509是由国际电信联盟(ITU-T)制定的数字证书标准。

扩展文件

  • .cer, .crt - 通常被用于二进制的DER文件格式(同于.der),不过也被用于Base64编码的文件 (例如 .pem),保存证书的公钥
  • .P7B - 同于 .p7c
  • .P7C - PKCS#7证书格式,仅仅包含证书和CRL列表信息,没有私钥。
  • .PFX - 同于 .p12
  • .P12 -PKCS#12文件,包含证书(公钥)和私钥(受密码保护),已经完整的证书链信
  • .jks - JAVA的keytools证书工具支持的证书私钥格式

工具

keytool

keytool 是个密钥和证书管理工具,它将密钥和证书储存在一个所谓的密钥仓库中。

  1. 密钥实体(Key entity):密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)
  2. 可信任的证书实体(trusted certificate entries):只包含公钥

keytool常用命令:

command? description
-genkey 生成密钥
-alias 指定密钥别名
-keystore 指定密钥库的名称
-storepass 指定密钥库的密码
-validity 指定证书有效期
-keyalg 指定密钥的算法,默认采用DSA
-keysize 指定密钥长度
-keypass 指定别名对应密钥的密码(私钥的密码)
-dname 指定证书所有者信息
-list 显示密钥库中的证书信息
-v 显示密钥库中的证书详细信息
-file 指定证书的路径名称
-delete 删除密钥库中某条目
-printcert 查看导出的证书信息
-keypasswd 修改密钥库中指定条目口令
-export 将别名指定的证书导出到文件
-import 将已签名数字证书导入密钥库

修改密钥别名:

keytool -changealias -alias ORIGALIAS -destalias NEWALIAS -keystore x.keystore
输入密钥库口令:密钥库密码
输入<ORIGALIAS>的密钥口令:密钥密码

导出证书
keystore中的private key实体不包含公钥,可以通过导出到证书,再从证书中得到公钥:

keytool -export -alias ALIAS -keystore KEYSTORE -file PATH
输入密钥库口令:密钥库密码


示例代码

加密解密

密钥库准备

使用keytool工具生成一个密钥实体:

keytool -genkey -alias origalias -keystore x.keystore

然后需要将密钥实体导出成证书,包含对应的公钥:

keytool -export -alias origalias -keystore x.keystore -file origalias.cer

代码

public class Demo {
	private static String STOREPATH = "C:/Users/Hang/x.keystore";
	private static String STOREPASS = "123456";
	private static String KEYALIAS = "origalias";
	private static String KEYPASS = "111111";
	private static String CERTPATH = "C:/Users/Hang/origalias.cer";
	private static String CERTPASS = "111111";
	private static String SignAlg = "SHA256withRSA";

	/*
	抛出异常:KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, NoSuchProviderException, UnrecoverableKeyException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, SignatureException
	*/
	public static void main(String[] args) throws Exception {
		//根据密钥库类型JKS得到密钥库实例
		KeyStore keyStore = KeyStore.getInstance("JKS","SUN");
		InputStream in = new FileInputStream(STOREPATH);
		keyStore.load(in, STOREPASS.toCharArray());

		//根据alias从keystone中取出密钥对
		PrivateKey privateKey = null;
		if(keyStore.isKeyEntry(KEYALIAS)){
			privateKey = (PrivateKey) keyStore.getKey(KEYALIAS, KEYPASS.toCharArray());
		}

		//使用命令导出密钥的证书`keytool -export -alias origalias -keystore x.keystore -file origalias.jks`

		//加载证书
		//证书格式为X509
	    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
	    //读取证书文件的输入流
	    InputStream certin = new FileInputStream(CERTPATH);
	    Certificate certificate = certificateFactory.generateCertificate(certin);
	    //从证书中得到公钥
	    PublicKey publicKey = certificate.getPublicKey();

	    System.out.println("私钥:\r\n"+privateKey);
	    System.out.println("公钥:\r\n"+publicKey);

	    String source = "X.509是由国际电信联盟(ITU-T)制定的数字证书标准。";
	    Cipher cipher = Cipher.getInstance("RSA");
	    cipher.init(Cipher.ENCRYPT_MODE, privateKey);
	    cipher.update("数字签名是 非对称密钥加密技术与数字摘要技术的应用。\r\n".getBytes("UTF-8"));
	    byte[] cipherByte = cipher.doFinal(source.getBytes("UTF-8"));

	    cipher.init(Cipher.DECRYPT_MODE, publicKey);
	    byte[] decrpytByte = cipher.doFinal(cipherByte);
	    System.out.println(new String(decrpytByte,"UTF-8"));
    }
}

签名验签

代码

签名验签中使用的还是上面代码中的公钥和私钥

Signature signature = Signature.getInstance(SignAlg);
	signature.initSign(privateKey);
	signature.update("数字签名是 非对称密钥加密技术与数字摘要技术的应用。\r\n".getBytes("UTF-8"));
	signature.update(source.getBytes("UTF-8"));
	byte[] signByte = signature.sign();

	signature.initVerify(certificate);
	//certificate 和 publicKey都可以验签
	signature.update("数字签名是 非对称密钥加密技术与数字摘要技术的应用。\r\n".getBytes("UTF-8"));
	signature.update(source.getBytes("UTF-8"));
	boolean verified = signature.verify(signByte);
	System.out.println(verified);**


时间: 2024-11-05 13:28:09

java加密与数字证书的相关文章

HTTPS中的对称密钥加密,公开密钥加密,数字证书

HTTPS中的对称密钥加密,公开密钥加密,数字证书 密钥 我们将未加密的内容称为明文,加密之后的内容称为密文. 简单来说,要加密一段明文,可以将这段内容输入到一个加密函数中,输出密文.但这种简单的加密方式存在被人盗取到加密函数从而破解明文的危险,且加密函数一般构成复杂,一旦被盗取更换成本较高. 于是人们想出了一个办法,在加密函数中再添加一个参数,这个参数只有通信双方知道,没有参数则无法正确解密出密码.这个参数被称为密钥.对于同一个加密函数而言,密钥值的不同则加密方式也不同,得出的密文也就不同.这

java加密解密和证书的demo

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyPair; import java.security.KeyPa

Java安全之数字证书

在前面说到,消息摘要用于验证数据完整性,对称与非对称加密用于保证数据保密性,数据签名用于数据的抗否认性,于是集这些安全手段于一身的终极武器--数字证书出现了.数字证书具备了加密/解密的必要信息,包含签名算法,可用于网络数据加密/解密交互,标识网络用户(计算机)身份.数据证书为发布公钥提供了一种简便途径,成为加密算法以及公钥的载体. 数字证书有多种文件编码格式,主要包含CER编码.DER编码等: a.CER(Canonical Encoding Rules,规范编码格式),是数字证书的一种编码格式

如何用JAVA代码签发数字证书

用JAVA签发数字证书 打开cmd 1.输入D: 2.输入cd keys 3.输入命令查看创建的密钥库的证书列表 keytool -list -v -keystore mykey.keystore -storepass 123456 4. 之前导出过server.cer文件,把这个文件安装到操作系统,过程默认. 5.创建一个密钥对,和之前一样,输入如下命令: --创建密钥对 keytool -genkey -dname "CN=tmp, OU=NC, O=Shanghai University,

RAS非对称加密与数字证书数字签名

它用图片通俗易懂地解释了,"数字签名"(digital signature)和"数字证书"(digital certificate)到底是什么. 我对这些问题的理解,一直是模模糊糊的,很多细节搞不清楚.读完这篇文章后,发现思路一下子就理清了.为了加深记忆,我把文字和图片都翻译出来了. 文中涉及的密码学基本知识,可以参见我以前的笔记. ==================================================== 数字签名是什么? 作者:Da

Java数字签名和数字证书

数字签名 作用:检验jar包是否为公钥发布者的发布的,并且没有被篡改. 过程: 1,作者使用散列算法对jar包生成散列(指纹); 2,作者使用私钥对散列进行加密, 3,将jar包和签名后的散列一起发布. 4,用户使用作者发布的公钥解密散列,得到jar包的指纹; 5,用户使用散列算法对jar生成指纹; 6,对比两个指纹是否一致. 数字证书:权威仍证机构使用自己的私钥对申请认证的用户的公钥进行签名的产物. 作用:检验用户得到的公钥的发布者是否可信 过程: 1,申请者携带材料到认证机构申请数字证书(即

公钥私钥加密解密数字证书数字签名详解

from http://codefine.co/1455.html 首先明确几个基本概念: 1.密钥对,在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的. 2.公钥,公钥用来给数据加密,用公钥加密的数据只能使用私钥解密. 3.私钥,如上,用来解密公钥加密的数据. 4.摘要,对需要传输的文本,做一个HASH计算,一般采用SHA1,SHA2来获得. 5.签名,使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名.

公钥 私钥 数字签名 数字证书

经常会听到公钥和私钥的概念,今天来讨论一下我对公钥和私钥的理解. 公钥和私钥是非对称加密的一种,有别于对称加密中,双方都持有相同的密钥,非对称加密,加解密双方持有不同的密钥,公开给对方的密钥被称为公钥,自己保留的密钥 被称为私钥.由公钥加密的内容只有私钥能解开,反之,由私钥加密的内容只能被公钥解开. 那么,公钥和私钥的用处在哪里呢.首先来了解一下对称加密,对称加密双方都持有相同的密钥,只要得不到密钥就解不开密文,但这是建立在双方都互相信任的基础上, 如果两边都可能存在不信任,那么随便把密钥交给对

魔推mpush:IOS开发之数字证书及其原理

IOS开发者通常需要跟各种数字证书.公钥和密钥打交道.相信各位开发者经常会在开发的过程当中经常会被这些证书啊.密钥啊.公钥之类弄的心力憔悴了.今儿,就这个问题跟大家啰嗦两句关于IOS数字证书的问题. 什么是数字证书? 数字证书是互联网的数字形式的标识认证,与护照或驾驶证的智能非常相似.数字证书是一种凭据.提供了某个实体的标识和其他支持信息.数字证书由颁发机构(CA)的权威机构发布的.因此,该权威机构负责担保证书信息的有效性.而且数字证书通常情况下只在特定的时段内有效. 数字证书包含证书中所标识的