java安全相关类 (java.security包)
发布日期:2021-06-29 22:24:12 浏览次数:2 分类:技术文章

本文共 8260 字,大约阅读时间需要 27 分钟。

文章目录

一、安全基础

1. 常用基本概念

一文看懂HTTPS、证书机构(CA)、证书、数字签名、私钥、公钥

参考URL: https://www.jianshu.com/p/29e0ba31fb8d

  • 加密和认证

    加密是将数据资料加密,使别人即使获取加密数据,也无法获取正确的资料内容,重点在于数据的安全性。

    认证是是确定数据的真实发送方,使别人无法伪造或冒充,重点在于用户的真实性。

  • 公钥和私钥

    公钥和私钥通常称非对称加密(又称 不对称加密)
    使用公钥和私钥的目的是为了安全的数据传输,必须实现如下目的:

    • 发送方将数据加密,在数据传输过程中不能被别人看到真实数据内容
    • 接收方能确定数据是发送方发送的数据,不是别人冒充。

    公钥:是公布出去给别人用的,可以被很多人获取。用来加密和验签

    私钥:只能自己持有,并且不可以被其他人知道,用来解密和签名

  • 证书

    证书是为公钥做认证,为了使公钥真实可信,防止他人伪造公钥;证书颁发 机构(证书中心CA)会用自己的私钥对用户的公钥和相关信息进行加密,生成”数字证书“,然后证书中心会公布自己的公钥给所有人,用来让用户使用此公钥验证”数字证书“是否由CA颁发,即是否真实可信。

证书分为公钥证书和私钥证书,每个人的公钥,私钥证书不一样,但是肯定是一一对应的。

2. 生成数字证书的流程

1、持有人将公钥以及身份信息发送给权威机构。

2、权威机构负责对持有人的身份进行验证,确保公钥和持有人的信息准确无误。
3、权威机构使用自己私钥对持有人公钥进行数字签名,生成数字证书。
4、为了确保证书不被篡改,权威机构对数字证书进行hash计算(指纹算法),生成摘要(指纹),使用自己的私钥对摘要进行数字签名,放到数字证书中。
5、对持有人收费。

3. 证书文件类型

一些常见的证书文件类型如下:

X.509#DER 二进制格式证书,常用后缀.cer .crt

X.509#PEM 文本格式证书,常用后缀.pem
有的证书内容是只包含公钥(服务器的公钥),如.crt、.cer、.pem
有的证书既包含公钥又包含私钥(服务器的私钥),如.pfx、.p12

现阶段多为X.509格式证书,X.509是ITU-T标准化部门基于他们之前的ASN.1定义的一套证书标准。之前有X.500。

编码方式有两种:DER编码 PEM编码

  • DER R用于二进制DER编码的证书。
  • PEM PEM用于ASCII(Base64)编码的各种X.509 v3 证书。PEM证书文件开始由一行"----- BEGIN CERTIFICATE -----“开始,由”----- END CERTIFICATE -----"结束。
    注:扩展名不一定为.pem 或.der.。也有.cer .crt

der类型的不用在编码解码,直接就是二进制的数据可以直接使用;

pem类型的数据要根据base64编码解码后,得到的数据需要进行增加或裁剪特殊字符-、\n、\r、begin信息、end信息等。

用Java自带的解析x509证书类,是不能解析sm2算法的证书,运行会抛出异常。用开源库bouncycastle可以解析。

4. HTTPS单向认证

Https在建立Socket连接之前,需要进行握手,具体过程如下:

在这里插入图片描述

  1. 客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息;

  2. 服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书;

  3. 客户端使用服务端返回的信息验证服务器的合法性,包括:

    证书是否过期;

    发行服务器证书的CA是否可靠;(通过查询浏览器或本机内的CA证书)
    返回的公钥是否能正确解开返回证书中的数字签名;(通过使用本机或浏览器内置的CA公钥进行解密)
    服务器证书上的域名是否和服务器的实际域名相匹配;
    验证通过后,将继续进行通信,否则,终止通信;

  4. 客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择;

  5. 服务器端在客户端提供的加密方案中选择加密程度最高的加密方式;

  6. 服务器将选择好的加密方案通过明文方式返回给客户端;

  7. 客户端接收到服务端返回的加密方式后,使用该加密方式生成产生随机码,用作通信过程中对称加密的密钥,使用服务端返回的公钥进行加密,将加密后的随机码发送至服务器;

  8. 服务器收到客户端返回的加密信息后,使用自己的私钥进行解密,获取对称加密密钥;

    在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全;

5. HTTPS双向认证

双向认证和单向认证类似,它额外增加了服务端对客户端的认证:

在这里插入图片描述

  1. 客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息;

  2. 服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书;

  3. 客户端使用服务端返回的信息验证服务器的合法性,包括:

    证书是否过期;

    发行服务器证书的CA是否可靠;(通过查询浏览器或本机内的CA证书)
    返回的公钥是否能正确解开返回证书中的数字签名;(通过使用本机或浏览器内置的CA公钥进行解密)
    服务器证书上的域名是否和服务器的实际域名相匹配;
    验证通过后,将继续进行通信,否则,终止通信;

  4. 服务端要求客户端发送客户端的证书即客户端证书公钥,客户端会将自己的证书发送至服务端;

  5. 验证客户端的证书,通过验证后,会获得客户端的公钥;

  6. 客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择

  7. 服务器端在客户端提供的加密方案中选择加密程度最高的加密方式;

  8. 将加密方案通过使用之前获取到的公钥进行加密,返回给客户端

  9. 客户端收到服务端返回的加密方案密文后,使用自己的私钥进行解密,获取具体加密方式,而后,产生该加密方式的随机码,用作加密过程中的密钥,使用之前从服务端证书中获取到的公钥进行加密后,发送给服务端;

  10. 服务端收到客户端发送的消息后,使用自己的私钥进行解密,获取对称加密的密钥,在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全;

二、国密算法

基于Java的(SM2_SM3_SM4)国密算法, 加密解密工具类及测试demo

参考URL: https://blog.csdn.net/s78365126/article/details/83345954

国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。

  • SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
  • SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
  • SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
  • SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。

1. SM2算法

SM2算法对比RSA算法,有哪些优势?

参考URL: https://www.sohu.com/a/321040448_188485

SM2算法由国家密码管理局于2010年12月17日发布,是我国自主设计的公钥密码算法,基于更加安全先进的椭圆曲线密码机制,在国际标准的ECC椭圆曲线密码理论基础上进行自主研发设计,具备ECC算法的性能特点并实现优化改进。

SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。

SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在安全性能、速度性能等方面都优于RSA算法,在我国商用密码体系中被用来替换RSA算法。国家密码管理局于2010年12月17日发布了SM2算法,并要求现有的基于RSA算法的电子认证系统、密钥管理系统、应用系统进升级改造,使用SM2算法。

目前,基于ECC的SM2证书普遍采用256位密钥长度,加密强度等同于3072位RSA证书,远高于业界普遍采用的2048位RSA证书。

SM2算法的应用推广:

然而,由于国密算法尚未实现广泛兼容,在主流浏览器、操作系统等终端环境中不受信任,面向互联网的产品应用中采用国产密码算法将无法满足可用性、易用性和全球通用性的需求,在实际应用中很难真正落地实施。

2. SM3算法

SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法

三、常用的国际加密算法 和国密算法 用途及原理对比

常用的国际加密算法 和国密算法 用途及原理对比

参考URL: https://kuaibao.qq.com/s/20180331G0J8Q300?refer=spider
SM2算法对比RSA算法,有哪些优势?
参考URL: https://www.sohu.com/a/321040448_188485

四、java.security包

官网:

https://docs.oracle.com/javase/8/docs/technotes/guides/security/overview/jsoverview.html

Java security technology includes a large set of APIs, tools, and implementations of commonly-used security algorithms, mechanisms, and protocols. The Java security APIs span a wide range of areas, including cryptography, public key infrastructure, secure communication, authentication, and access control. Java security technology provides the developer with a comprehensive security framework for writing applications, and also provides the user or administrator with a a set of tools to securely manage applications.

Java安全技术包括大量api、工具和常用安全算法、机制和协议的实现。java security api涉及很多领域,包括密码学、公钥基础设施、安全通信、身份验证和访问控制。Java安全技术为开发人员提供了编写应用程序的全面安全框架,也为用户或管理员提供了一套安全管理应用程序的工具。

1. Java安全类和接口的名称、包和用法

官网https://docs.oracle.com/javase/8/docs/technotes/guides/security/overview/jsoverview.html

Java安全类和接口的名称、包和用法。

在这里插入图片描述

公私钥相关类和接口

Key包括公钥(PublicKey)、私钥(PrivateKey)两种。

PrivateKey接口

官网: https://docs.oracle.com/javase/8/docs/api/java/security/PrivateKey.html

该接口位于java.security包下,声明:public interface PrivateKey extends Key

私钥。此接口不包含任何方法或常量。它仅用于将所有私钥接口分组(并为其提供类型安全)。 注:特定的私钥接口扩展此接口。请参见(例如)java.security.interfaces 中的 DSAPrivateKey 接口。

ECPrivateKey接口

该接口拓展自PrivateKey接口。

椭圆曲线 (EC) 专用密钥的接口。

PublicKey接口

该接口位于java.security包下,声明:public interface PublicKey extends Key

Security类

管理Provider的工具:Security

证书相关类

类 java.security.cert.Certificate

类 X509Certificate

X.509 证书的抽象类。

2. java操作x509数字证书

java操作x509数字证书

参考URL: https://blog.csdn.net/do_bset_yourself/article/details/78159697

五、第三方库:BouncyCastle(轻量级密码术包)

BouncyCastle

参考URL: https://www.liaoxuefeng.com/wiki/1252599548343744/1305362418368545

Java标准库提供了一系列常用的哈希算法。

但如果我们要用的某种算法,Java标准库没有提供怎么办?

BouncyCastle就是一个提供了很多哈希算法和加密算法的第三方库。它提供了Java标准库没有的一些算法,例如,RipeMD160哈希算法。

BC指Bouncy Castle, CC指Commons Codec都是第三方拓展包。

**Java标准库的java.security包提供了一种标准机制,允许第三方提供商无缝接入。**我们要使用BouncyCastle提供的RipeMD160算法,需要先把BouncyCastle注册一下:

public class Main {
public static void main(String[] args) throws Exception {
// 注册BouncyCastle: Security.addProvider(new BouncyCastleProvider()); // 按名称正常调用: MessageDigest md = MessageDigest.getInstance("RipeMD160"); md.update("HelloWorld".getBytes("UTF-8")); byte[] result = md.digest(); System.out.println(new BigInteger(1, result).toString(16)); }}

其中,注册BouncyCastle是通过下面的语句实现的:

Security.addProvider(new BouncyCastleProvider());

注册只需要在启动时进行一次,后续就可以使用BouncyCastle提供的所有哈希算法和加密算法。

总结: BouncyCastle是一个开源的第三方算法提供商;

BouncyCastle提供了很多Java标准库没有提供的哈希算法和加密算法;

使用第三方算法前需要通过Security.addProvider()注册。

1. BouncyCastle 使用sm2、sm3

用Java自带的解析x509证书类,是不能解析sm2算法的证书,运行会抛出异常。用开源库bouncycastle可以解析。

SM2国密算法证书解析

参考URL: http://www.jonllen.com/jonllen/work/174.aspx

六、Spring Security包

1. 什么是Spring Security

手把手带你入门 Spring Security!

参考URL: https://www.cnblogs.com/lenve/p/11242055.html

Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是 Shiro 的天下。

相对于 Shiro,在 SSM/SSH 中整合 Spring Security 都是比较麻烦的操作,所以,Spring Security 虽然功能比 Shiro 强大,但是使用反而没有 Shiro 多(Shiro 虽然功能没有 Spring Security 多,但是对于大部分项目而言,Shiro 也够用了)。

自从有了 Spring Boot 之后,Spring Boot 对于 Spring Security 提供了 自动化配置方案,可以零配置使用 Spring Security。

因此,一般来说,常见的安全管理技术栈的组合是这样的:

SSM + ShiroSpring Boot/Spring Cloud + Spring Security

2. BCryptPasswordEncoder方法

Spring security中的BCryptPasswordEncoder方法对密码进行加密与密码匹配

参考URL: https://www.jianshu.com/p/89c4c476e189

Spring Security 中提供了 BCryptPasswordEncoder 密码编码工具,可以非常方便的实现密码的加密加盐,相同明文加密出来的结果总是不同,这样就不需要用户去额外保存盐的字段了。

使用场景:用于用户密码的加密和解密。

spring security中的BCryptPasswordEncoder方法采用SHA-256 +随机盐+密钥对密码进行加密。

public class BCryptPasswordEncoderTest {    public static void main(String[] args) {        String pass = "admin";        BCryptPasswordEncoder bcryptPasswordEncoder = new BCryptPasswordEncoder();        String hashPass = bcryptPasswordEncoder.encode(pass);        System.out.println(hashPass);        boolean f = bcryptPasswordEncoder.matches("admin",hashPass);        System.out.println(f);    }}

每次输出的hashPass 都不一样,但是最终的f都为 true,即匹配成功。查看代码,可以看到,其实每次的随机盐,都保存在hashPass中。随机盐,会在比较的时候,重新被取出。即,加密的hashPass中,前部分已经包含了盐信息。

3. spring boot 中使用 Spring Security

手把手带你入门 Spring Security!

参考URL: https://www.cnblogs.com/lenve/p/11242055.html

推荐参考 参考URL原作者内容,写的比较详细,可参考。

转载地址:https://docker.blog.csdn.net/article/details/105357202 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java 打jar包 (JAR命令)
下一篇:Spring boot 2.0 Actuator 的健康检查

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月27日 18时04分17秒