数字签名
数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是在使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是非对称密钥加密技术与数字摘要技术的应用。
数字签名简单的说就是在网络中传输数据时候,给数据添加一个数字签名,表示是谁发的数据,而且还能证明数据没有被篡改。
数字签名的主要作用就是保证数据的有效性(验证是谁发的)和完整性(证明信息没有被篡改)。
基本原理
使用一定的HASH算法将数据报文算出一个固定位数的摘要信息,如此就完成了数字签名。然后使用私钥将摘要加密,并附在数据报文上一起发送给接收者。
接收者通过公钥解密数据报文,得到数字签名中的摘若。再对数据报文本身使用Hash函数算出报文摘要,如果两个摘要一致,说明数据未被篡改,说明数据是完整的。
数字证书
当对签名进行验证时,需要用到公钥,如果公钥是伪造的,那就无法验证数字签名,也就根本不可能从数字签名确定数据的合法性,于是就出现了数字证书。
数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。因此数字证书又称为数字标识。数字证书对网络用户在计算机网络交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性。
简而言之: 数字证书是互联网通讯中标志通讯各方身份信息一串数字。提供了一种在Internet上验证通信实体身份的方式。它是由CA颁发给网站的一种身份的方式。它里面包含了该网站的公钥、有效时间、网站的地址、及 CA的数字签名等。
作用
使用CA的私钥将网站的公钥等信息进行签名,当客户端请求服务器端的时候,网站会把证书发给客户端,客户端先通过CA的数字签名校验CA的身份,来证明证书的真实完整性。
数字签名的实现
public static void main(String[] args) throws Exception {
// 加密算法
String algorithm = "RSA";
// 创建密钥对生成器对象
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
// 生成密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 生成私钥
PrivateKey privateKey = keyPair.getPrivate();
// 生成公钥
PublicKey publicKey = keyPair.getPublic();
// 加密算法
String algorithm2 = "sha256withrsa";
String input = "Hello World";
// 生成签名
String signaturedData = getSignature(input, algorithm2, privateKey);
// 校验签名
boolean verifySignature = verifySignature(input, algorithm2, publicKey, signaturedData);
System.out.println("签名校验是否成功:" + verifySignature);
}
/**
* 生成签名
*
* @param input 原文
* @param algorithm 算法
* @param privateKey 私钥
* @return : 签名
*/
private static String getSignature(String input, String algorithm, PrivateKey privateKey) throws Exception {
// 获取签名对象
Signature signature = Signature.getInstance(algorithm);
// 初始化签名
signature.initSign(privateKey);
// 传入原文
signature.update(input.getBytes());
// 开始签名
byte[] sign = signature.sign();
// 对签名数据进行Base64编码
return Base64.encode(sign);
}
/**
* 校验签名
*
* @param input 原文
* @param algorithm 算法
* @param publicKey 公钥
* @param signaturedData 签名
* @return : 数据是否被篡改
*/
private static boolean verifySignature(String input, String algorithm, PublicKey publicKey, String signaturedData) throws Exception {
// 获取签名对象
Signature signature = Signature.getInstance(algorithm);
// 初始化签名
signature.initVerify(publicKey);
// 传入原文
signature.update(input.getBytes());
// 校验数据
return signature.verify(Base64.decode(signaturedData));
}
keytool工具
Keytool 是一个java提供的证书管理工具
keytool工具路径:*\Java\jdk1.8\bin\
C:\Users\Administrator>keytool
密钥和证书管理工具
命令:
-certreq 生成证书请求
-changealias 更改条目的别名
-delete 删除条目
-exportcert 导出证书
-genkeypair 生成密钥对
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importcert 导入证书或证书链
-importpass 导入口令
-importkeystore 从其他密钥库导入一个或所有条目
-keypasswd 更改条目的密钥口令
-list 列出密钥库中的条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令
使用 "keytool -command_name -help" 获取 command_name 的用法
基本命令
生成keypair
keytool -genkeypair
keytool -genkeypair -alias mykey(为证书指定别名,否则采用默认的名称为mykey)
D:\>keytool -genkeypair -alias mykey
输入密钥库口令:
密钥库口令太短 - 至少必须为 6 个字符
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: CJ
您的组织单位名称是什么?
[Unknown]: ZD
您的组织名称是什么?
[Unknown]: ZD
您所在的城市或区域名称是什么?
[Unknown]: CD
您所在的省/市/自治区名称是什么?
[Unknown]: SC
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=CJ, OU=ZD, O=ZD, L=CD, ST=SC, C=CN是否正确?
[否]: 是
输入 <mykey> 的密钥口令
(如果和密钥库口令相同, 按回车):
查看keystore密钥库文件中有哪些项目
keytool -list
keytool -list -v
keytool -exportcert -alias lisi -file lisi.cer
D:\>keytool -list
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
mykey, 2022-5-28, PrivateKeyEntry,
证书指纹 (SHA-256): BC:61:59:12:E9:86:9B:A0:58:D1:B9:F5:CE:79:A1:F9:9A:C3:F6:95:A6:60:61:CD:F1:35:FC:F9:95:29:08:D2
生成可打印的证书
keytool -exportcert -alias mykey -file mykey.cer -rfc
D:\>keytool -exportcert -alias mykey -file mykey.cer -rfc
输入密钥库口令:
存储在文件 <mykey.cer> 中的证书
显示数字证书文件中的证书信息
keytool -printcert -file mykey.cer
所有者: CN=CJ, OU=ZD, O=ZD, L=CD, ST=SC, C=CN
发布者: CN=CJ, OU=ZD, O=ZD, L=CD, ST=SC, C=CN
序列号: 1b2429fe
生效时间: Sat May 28 19:28:45 CST 2022, 失效时间: Fri Aug 26 19:28:45 CST 2022
证书指纹:
SHA1: 06:E7:F6:D7:C8:7D:AC:8B:CD:6D:A2:B1:84:3C:83:18:96:88:A5:16
SHA256: BC:61:59:12:E9:86:9B:A0:58:D1:B9:F5:CE:79:A1:F9:9A:C3:F6:95:A6:60:61:CD:F1:35:FC:F9:95:29:08:D2
签名算法名称: SHA256withDSA
主体公共密钥算法: 2048 位 DSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 1A E5 9E D1 3A 6F 82 76 5B C9 02 CB 7E 63 E1 BC ....:o.v[....c..
0010: C7 6C 13 04 .l..
]
]
双击mykey.cer即可打开
生成私钥公钥
生成密钥证书,采用RSA 算法,每个证书包含公钥和私钥
1.1根据命令提示生成
keytool -genkeypair -alias mykey -keyalg RSA -keypass 123456 -keystore mykeystore.jks -storepass 123456
-alias:密钥的别名
-keyalg:使用的hash算法
-keypass:密钥的访问密码
-keystore:密钥库文件名,xc.keystore保存了生成的证书
-storepass:密钥库的访问密码
您的名字与姓氏是什么?
[Unknown]: CJ
您的组织单位名称是什么?
[Unknown]: ZD
您的组织名称是什么?
[Unknown]: ZD
您所在的城市或区域名称是什么?
[Unknown]: CD
您所在的省/市/自治区名称是什么?
[Unknown]: SC
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=CJ, OU=ZD, O=ZD, L=CD, ST=SC, C=CN是否正确?
[否]: 是
1.2.直接使用命令生成
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ./tls.key -x509 -out ./tls.crt -subj /C=CN/ST=SC/L=SC/O=nginx/CN=CJ -days 365
req 产生证书签发申请命令
-newkey 生成新私钥
rsa:4096 生成秘钥位数
-nodes 表示私钥不加密
-sha256 使用SHA-2哈希算法
-keyout 将新创建的私钥写入的文件名
-x509 签发X.509格式证书命令。X.509是最通用的一种签名证书格式。
-out 指定要写入的输出文件名
-subj 指定用户信息
-days 有效期
2.查询证书信息
keytool -list -keystore mykeystore.jks
keytool -list -keystore mykeystore.jks
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
mykey, 2022-5-28, PrivateKeyEntry,
证书指纹 (SHA-256): 82:0D:FB:A0:DD:B8:EC:E3:7D:27:40:93:76:CF:8C:44:F1:5F:DD:4C:2F:F7:EA:E2:05:BB:3E:31:C0:11:A4:BA
3.删除别名
keytool -delete -alias mykey -keystore mykeystore.jsk
导出公钥
openssl是一个加解密工具包,使用openssl来导出公钥信息。
安装 openssl:http://slproweb.com/products/Win32OpenSSL.html
,并配置openssl的path环境变量
执行
keytool -list -rfc --keystore mykeystore.jks | openssl x509 -inform pem -pubkey
命令后得到公钥,将其拷贝到文本public.key文件合并为一行,然后就可以在认证授权项目中使用了。
D:\>keytool -list -rfc --keystore mykeystore.jks | openssl x509 -inform pem -pubkey
输入密钥库口令: 123456
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg3UsA6KqXsrAwngE/XbA
B3Bb/P8Zh/dkuQiTpIWaTlN1Fpksd9R6N3p3df+qVJUlMDEEbgrP7L8wXiCyH+UR
UvjI1H1U3BUZoiztqptWL1zzG6P8ef2XlUJJ6MEUO9JMY2UMx6kwMHs52RwPAJBj
cBJvYb4o6aneT2DLZV6D3IobJYN7VdxByeqeoaPBvDKSh5HYyvhj6P354WJV/d86
FAQnR3I8QDxf0azaYzOIgtd0LECvwhTwpkwGHbnex5zSvCmcnIjIGVMoqCEMPvUc
BxrBY32qGWc2yMPZI+PFTpUdAMARrHfXrwbtyM5JvsiMxzBGZAVZRSFhl9D/bOLr
WwIDAQAB
-----END PUBLIC KEY-----
-----BEGIN CERTIFICATE-----
MIIDOzCCAiOgAwIBAgIEdxFWfTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJD
TjELMAkGA1UECBMCU0MxCzAJBgNVBAcTAkNEMQswCQYDVQQKEwJaRDELMAkGA1UE
CxMCWkQxCzAJBgNVBAMTAkNKMB4XDTIyMDUyODExNDc1OFoXDTIyMDgyNjExNDc1
OFowTjELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAlNDMQswCQYDVQQHEwJDRDELMAkG
A1UEChMCWkQxCzAJBgNVBAsTAlpEMQswCQYDVQQDEwJDSjCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAIN1LAOiql7KwMJ4BP12wAdwW/z/GYf3ZLkIk6SF
mk5TdRaZLHfUejd6d3X/qlSVJTAxBG4Kz+y/MF4gsh/lEVL4yNR9VNwVGaIs7aqb
Vi9c8xuj/Hn9l5VCSejBFDvSTGNlDMepMDB7OdkcDwCQY3ASb2G+KOmp3k9gy2Ve
g9yKGyWDe1XcQcnqnqGjwbwykoeR2Mr4Y+j9+eFiVf3fOhQEJ0dyPEA8X9Gs2mMz
iILXdCxAr8IU8KZMBh253sec0rwpnJyIyBlTKKghDD71HAcawWN9qhlnNsjD2SPj
xU6VHQDAEax3168G7cjOSb7IjMcwRmQFWUUhYZfQ/2zi61sCAwEAAaMhMB8wHQYD
VR0OBBYEFD6Z+Gpw6WCw1ZH9KC4+AxOY+4QzMA0GCSqGSIb3DQEBCwUAA4IBAQAV
HxX9unkXUcJaFUI/dfjooD+L4nolnD1qn7Ir7V7ZVgzIs8pBySc4C3AFIDL3G7Ny
uy8gePU5Lc33AICvJRcxpXckpgKzGdWd7draJ2wGzvFru3sRGILxc6wCsBB6IfUV
TOS4meVo0FrJggMlCHjUi9Uu6FDS4fEW6o+dEIvdisSz9g2J2XIOafxQHSHY/jCr
mE2HDs8MOgq6RkZ98IDT8nS3QUhUs2Ayg1thweRp5Xo6XWSeB8TTxXTEzgDEJuOa
VM77Jp5zCgBoiUpfqbpjxWRM+V5yzO+7Qf21CIOqcSwEe2iB59ExvZpMrM5cgRQj
K3zR4YcKD5iiimKVmAux
-----END CERTIFICATE-----
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136959.html