java安全相关类 (java.security包)
文章目錄
- 一、安全基礎
- 1. 常用基本概念
- 2. 生成數字證書的流程
- 3. 證書文件類型
- 4. HTTPS單向認證
- 5. HTTPS雙向認證
- 二、國密算法
- 1. SM2算法
- 2. SM3算法
- 三、常用的國際加密算法 和國密算法 用途及原理對比
- 四、java.security包
- 1. Java安全類和接口的名稱、包和用法
- 公私鑰相關類和接口
- PrivateKey接口
- ECPrivateKey接口
- PublicKey接口
- Security類
- 證書相關類
- 2. java操作x509數字證書
- 五、第三方庫:BouncyCastle(輕量級密碼術包)
- 1. BouncyCastle 使用sm2、sm3
- 六、Spring Security包
- 1. 什么是Spring Security
- 2. BCryptPasswordEncoder方法
- 3. spring boot 中使用 Spring Security
一、安全基礎
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連接之前,需要進行握手,具體過程如下:
客戶端向服務端發送SSL協議版本號、加密算法種類、隨機數等信息;
服務端給客戶端返回SSL協議版本號、加密算法種類、隨機數等信息,同時也返回服務器端的證書,即公鑰證書;
客戶端使用服務端返回的信息驗證服務器的合法性,包括:
證書是否過期;
發行服務器證書的CA是否可靠;(通過查詢瀏覽器或本機內的CA證書)
返回的公鑰是否能正確解開返回證書中的數字簽名;(通過使用本機或瀏覽器內置的CA公鑰進行解密)
服務器證書上的域名是否和服務器的實際域名相匹配;
驗證通過后,將繼續進行通信,否則,終止通信;
客戶端向服務端發送自己所能支持的對稱加密方案,供服務器端進行選擇;
服務器端在客戶端提供的加密方案中選擇加密程度最高的加密方式;
服務器將選擇好的加密方案通過明文方式返回給客戶端;
客戶端接收到服務端返回的加密方式后,使用該加密方式生成產生隨機碼,用作通信過程中對稱加密的密鑰,使用服務端返回的公鑰進行加密,將加密后的隨機碼發送至服務器;
服務器收到客戶端返回的加密信息后,使用自己的私鑰進行解密,獲取對稱加密密鑰;
在接下來的會話中,服務器和客戶端將會使用該密碼進行對稱加密,保證通信過程中信息的安全;
5. HTTPS雙向認證
雙向認證和單向認證類似,它額外增加了服務端對客戶端的認證:
客戶端向服務端發送SSL協議版本號、加密算法種類、隨機數等信息;
服務端給客戶端返回SSL協議版本號、加密算法種類、隨機數等信息,同時也返回服務器端的證書,即公鑰證書;
客戶端使用服務端返回的信息驗證服務器的合法性,包括:
證書是否過期;
發行服務器證書的CA是否可靠;(通過查詢瀏覽器或本機內的CA證書)
返回的公鑰是否能正確解開返回證書中的數字簽名;(通過使用本機或瀏覽器內置的CA公鑰進行解密)
服務器證書上的域名是否和服務器的實際域名相匹配;
驗證通過后,將繼續進行通信,否則,終止通信;
服務端要求客戶端發送客戶端的證書即客戶端證書公鑰,客戶端會將自己的證書發送至服務端;
驗證客戶端的證書,通過驗證后,會獲得客戶端的公鑰;
客戶端向服務端發送自己所能支持的對稱加密方案,供服務器端進行選擇
服務器端在客戶端提供的加密方案中選擇加密程度最高的加密方式;
將加密方案通過使用之前獲取到的公鑰進行加密,返回給客戶端
客戶端收到服務端返回的加密方案密文后,使用自己的私鑰進行解密,獲取具體加密方式,而后,產生該加密方式的隨機碼,用作加密過程中的密鑰,使用之前從服務端證書中獲取到的公鑰進行加密后,發送給服務端;
服務端收到客戶端發送的消息后,使用自己的私鑰進行解密,獲取對稱加密的密鑰,在接下來的會話中,服務器和客戶端將會使用該密碼進行對稱加密,保證通信過程中信息的安全;
二、國密算法
基于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 消息摘要??梢杂肕D5作為對比理解。該算法已公開。校驗結果為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 + Shiro Spring Boot/Spring Cloud + Spring Security2. 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原作者內容,寫的比較詳細,可參考。
總結
以上是生活随笔為你收集整理的java安全相关类 (java.security包)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】Spring Boot 过滤器、
- 下一篇: 中国石油大计算机在线考试中心,中国石油大