数字签名验证及加解密中的一些概念
2016-05-20 13:49
225 查看
对称加密
通信双方使用同一个密钥( secret )加密解密密钥(Secret)
对称加密中双方共同使用的密码非对称加密
通信中的密钥是成对的:公钥A和私钥B。用A加密的密文只能用B解密,同样,用B加密的密文也只能用A解密在非对称加密算法中,如果一个“密钥对”中的两个密钥满足以下两个条件:
1、对信息用其中一个密钥加密后,只有用另一个密钥才能解开;
2、其中一个密钥公开后,根据公开的密钥别人也无法算出另一个。
那么我们就称这个密钥对为非对称密钥对,公开的密钥称为公钥,不公开的密钥称为私钥。
常见的非对称加密算法包括RSA、Elgamal、D-H、ECC(椭圆曲线加密算法)等。
公钥(Public Key) & 私钥(Private Key)
公钥与私钥一一对应。公钥自由发布给外部通信方。
私钥需要自己秘密存储,一旦泄漏则可能导致身份被伪造,机密信息泄漏。
加密 & 解密
发方用收方的公钥加密,收方用自己的私钥解密,防止信息被第三方获取。当发方向收方通信时发方用收方的公钥对原文进行加密,收方收到发方的密文后,用自己的私钥进行解密,其中他人是无法解密的,因为他人不拥有自己的私钥,这就是用公钥加密,私钥解密用于通信;
签名 & 验证
发方用自己的私钥签名,收方用发方公钥验证,用来验证发方的身份,防止信息被第三方伪造。发出的签名一般并非是对原文本身进行加密,而是要对原文进行所谓的“哈希”(Hash)运算,即对原文作数字摘要。该密码算法也称单向散列运算,其运算结果称为哈希值,或称数字摘要,也有人将其称为“数字指纹”。哈希值有固定的长度,运算是不可逆的,不同的明文其哈希值是不同的,而同样的明文其哈希值是相同并且是唯一的,原文的任何改动,其哈希值就要发生变化。
签名验证与加密解密的原理相同,签名即是用私钥对数字摘要进行加密,将原文和密文同时发给收方,收方用公钥对密文进行解密,然后与原文的摘要进行比对验证。
非对称密钥的基本使用场景有两种:1、公钥对交易信息加密,私钥对交易信息解密。私钥持有人解密后,可以使用收到的价值。2、私钥对信息签名,公钥验证签名。通过公钥签名验证的信息确认为私钥持有人发出。
数字证书 & CA(Certificate Authority)
数字证书由证书中心(CA)颁发,包含客户公钥和其他信息(如域名,公司名称),需要用证书中心的公钥进行解密。CA是数字证书认证中心的简称,是指发放、管理、废除数字证书的机构。CA的作用是检查证书持有者身份的合法性,并用自己的私钥对客户的公钥和客户信息进行加密,生成数字证书,防止证书被伪造或篡改,以及对证书和密钥进行管理。
证书链
TODOKeyStore & Keytool
KeyStore 是用来储存密钥和证书的密钥仓库,其中包含两类条目( Entry ):密钥项、证书项。KeyStore 一般是一个文件,用密码保护。参见:
https://docs.oracle.com/javase/7/docs/api/java/security/KeyStore.html
http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#KeystoreImplementation
Keytool 是Java 中(位于 JDK\Bin 目录下)管理密钥和证书的工具,可以用来生成密钥、创建数字证书,所有的密钥和数字证书是以一条一条(采用别名区别)的形式存入 KeyStore 中,一条证书包含私钥,公钥和对应的证书主体信息三种信息。
Keytool 可以将 KeyStore中的证书导出为数字证书文件,数字证书文件只包括主体信息和对应的公钥。JDK 的 Keytool 不能导出私钥,但是用一些三方的证书工具可以导出,如 jksExportKey,KeyStore Explorer等 。
KeyStore的几种实现类型
JKS:Java Key Store,提供者是 SUN,Java特有,也是Java编程中最常见的类型。其中的条目可以是私钥和证书,但不支持对称加密中的secret。其中保存的私钥不能在 Java 中取出。
Java中相关类:sun.security.provider.JavaKeyStore
JCEKS
JCE Key Store (Java Cryptography Extension KeyStore),提供者是 SunJCE。从 Java 1.4 的版本开始有,是 JKS 的超集,支持更多的算法,条目可以是私钥、证书和对称加密的secret。用更强的三重数据加密算法(Triple DES encryption)保护其中的私钥。
Java中相关类:com.sun.crypto.provider.JceKeyStore
PKCS12
是 PKCS(The Public-Key Cryptography Standards,公钥加密标准)中定义的个人信息交换语法,非Java特有,在Java和其它语言中都可以使用,可以保存私钥、证书和secret。不同于JKS的是,其中的私钥内容可以在 Java 中取出。这种类型更便于不同编程语言之间的适配。目前 Java 中默认类型是 JKS,但从 Java 9开始,默认类型将改为 PKCS12。
Java中相关类:sun.security.pkcs12.PKCS12KeyStore
Java SE 中支持以上三种类型,参见:http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyStore
BKS:
Bouncy Castle Keystore(提供者是 Bouncy Castle),目前主要是 Android 在使用这种类型。
参见 https://bouncycastle.org/specifications.html
参考
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html RSA算法原理http://bank.hexun.com/2009-06-24/118958531.html 用实例给新手讲解RSA加密算法
http://crypto.stackexchange.com/questions/10728/can-an-rsa-private-key-have-several-public-keys Can an RSA private key have several public keys?
http://www.youdzone.com/signature.html What is a Digital Signature?
http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java—-Overview 几种KeyStore类型的区别
https://docs.oracle.com/javase/7/docs/technotes/guides/security/crypto/HowToImplAProvider.html Jar包签名验证
http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html
http://docs.oracle.com/javase/7/docs/technotes/guides/security/crypto/CryptoSpec.html#KeystoreImplementation
相关文章推荐
- Patrol 7 架构下?的处理方法
- 清除IE分级审查密码
- 华为路由器密码恢复
- 注册表导出管理员密码文件
- 用ASP编写的加密和解密类
- 解密网页加密的两个方法
- 路由器版本与密码恢复
- C#实现子窗体与父窗体通信方法实例总结
- 密码知识教程一
- 密码破解全教程
- VBS脚本加密/解密VBS脚本(简易免杀版1.1)
- 通过批处理修改FTP账号和密码
- BAT加密工具 EncryBat 非编译型bat批处理加密方案与代码
- C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例
- redis中修改配置文件中的端口号 密码方法
- SQLServer 2008中的代码安全(一) 存储过程加密与安全上下文
- 更改Mysql root用户密码
- 实例讲解SQL Server加密功能
- 资料共享传送门-----此篇持续更新中
- Exchange 2016/2013 - 禁用OWA密码更改