java安全相关类 (java.security包)
文章目錄
- 一、安全基礎(chǔ)
- 1. 常用基本概念
- 2. 生成數(shù)字證書的流程
- 3. 證書文件類型
- 4. HTTPS單向認(rèn)證
- 5. HTTPS雙向認(rèn)證
- 二、國密算法
- 1. SM2算法
- 2. SM3算法
- 三、常用的國際加密算法 和國密算法 用途及原理對比
- 四、java.security包
- 1. Java安全類和接口的名稱、包和用法
- 公私鑰相關(guān)類和接口
- PrivateKey接口
- ECPrivateKey接口
- PublicKey接口
- Security類
- 證書相關(guān)類
- 2. java操作x509數(shù)字證書
- 五、第三方庫:BouncyCastle(輕量級密碼術(shù)包)
- 1. BouncyCastle 使用sm2、sm3
- 六、Spring Security包
- 1. 什么是Spring Security
- 2. BCryptPasswordEncoder方法
- 3. spring boot 中使用 Spring Security
一、安全基礎(chǔ)
1. 常用基本概念
一文看懂HTTPS、證書機構(gòu)(CA)、證書、數(shù)字簽名、私鑰、公鑰
參考URL: https://www.jianshu.com/p/29e0ba31fb8d
-
加密和認(rèn)證
加密是將數(shù)據(jù)資料加密,使別人即使獲取加密數(shù)據(jù),也無法獲取正確的資料內(nèi)容,重點在于數(shù)據(jù)的安全性。
認(rèn)證是是確定數(shù)據(jù)的真實發(fā)送方,使別人無法偽造或冒充,重點在于用戶的真實性。 -
公鑰和私鑰
公鑰和私鑰通常稱非對稱加密(又稱 不對稱加密)
使用公鑰和私鑰的目的是為了安全的數(shù)據(jù)傳輸,必須實現(xiàn)如下目的:- 發(fā)送方將數(shù)據(jù)加密,在數(shù)據(jù)傳輸過程中不能被別人看到真實數(shù)據(jù)內(nèi)容
- 接收方能確定數(shù)據(jù)是發(fā)送方發(fā)送的數(shù)據(jù),不是別人冒充。
公鑰:是公布出去給別人用的,可以被很多人獲取。用來加密和驗簽
私鑰:只能自己持有,并且不可以被其他人知道,用來解密和簽名 -
證書
證書是為公鑰做認(rèn)證,為了使公鑰真實可信,防止他人偽造公鑰;證書頒發(fā) 機構(gòu)(證書中心CA)會用自己的私鑰對用戶的公鑰和相關(guān)信息進行加密,生成”數(shù)字證書“,然后證書中心會公布自己的公鑰給所有人,用來讓用戶使用此公鑰驗證”數(shù)字證書“是否由CA頒發(fā),即是否真實可信。
證書分為公鑰證書和私鑰證書,每個人的公鑰,私鑰證書不一樣,但是肯定是一一對應(yīng)的。
2. 生成數(shù)字證書的流程
1、持有人將公鑰以及身份信息發(fā)送給權(quán)威機構(gòu)。
2、權(quán)威機構(gòu)負(fù)責(zé)對持有人的身份進行驗證,確保公鑰和持有人的信息準(zhǔn)確無誤。
3、權(quán)威機構(gòu)使用自己私鑰對持有人公鑰進行數(shù)字簽名,生成數(shù)字證書。
4、為了確保證書不被篡改,權(quán)威機構(gòu)對數(shù)字證書進行hash計算(指紋算法),生成摘要(指紋),使用自己的私鑰對摘要進行數(shù)字簽名,放到數(shù)字證書中。
5、對持有人收費。
3. 證書文件類型
一些常見的證書文件類型如下:
X.509#DER 二進制格式證書,常用后綴.cer .crt
X.509#PEM 文本格式證書,常用后綴.pem
有的證書內(nèi)容是只包含公鑰(服務(wù)器的公鑰),如.crt、.cer、.pem
有的證書既包含公鑰又包含私鑰(服務(wù)器的私鑰),如.pfx、.p12
現(xiàn)階段多為X.509格式證書,X.509是ITU-T標(biāo)準(zhǔn)化部門基于他們之前的ASN.1定義的一套證書標(biāo)準(zhǔn)。之前有X.500。
編碼方式有兩種:DER編碼 PEM編碼
- DER R用于二進制DER編碼的證書。
- PEM PEM用于ASCII(Base64)編碼的各種X.509 v3 證書。PEM證書文件開始由一行"----- BEGIN CERTIFICATE -----“開始,由”----- END CERTIFICATE -----"結(jié)束。
注:擴展名不一定為.pem 或.der.。也有.cer .crt
der類型的不用在編碼解碼,直接就是二進制的數(shù)據(jù)可以直接使用;
pem類型的數(shù)據(jù)要根據(jù)base64編碼解碼后,得到的數(shù)據(jù)需要進行增加或裁剪特殊字符-、\n、\r、begin信息、end信息等。
用Java自帶的解析x509證書類,是不能解析sm2算法的證書,運行會拋出異常。用開源庫bouncycastle可以解析。
4. HTTPS單向認(rèn)證
Https在建立Socket連接之前,需要進行握手,具體過程如下:
客戶端向服務(wù)端發(fā)送SSL協(xié)議版本號、加密算法種類、隨機數(shù)等信息;
服務(wù)端給客戶端返回SSL協(xié)議版本號、加密算法種類、隨機數(shù)等信息,同時也返回服務(wù)器端的證書,即公鑰證書;
客戶端使用服務(wù)端返回的信息驗證服務(wù)器的合法性,包括:
證書是否過期;
發(fā)行服務(wù)器證書的CA是否可靠;(通過查詢?yōu)g覽器或本機內(nèi)的CA證書)
返回的公鑰是否能正確解開返回證書中的數(shù)字簽名;(通過使用本機或瀏覽器內(nèi)置的CA公鑰進行解密)
服務(wù)器證書上的域名是否和服務(wù)器的實際域名相匹配;
驗證通過后,將繼續(xù)進行通信,否則,終止通信;
客戶端向服務(wù)端發(fā)送自己所能支持的對稱加密方案,供服務(wù)器端進行選擇;
服務(wù)器端在客戶端提供的加密方案中選擇加密程度最高的加密方式;
服務(wù)器將選擇好的加密方案通過明文方式返回給客戶端;
客戶端接收到服務(wù)端返回的加密方式后,使用該加密方式生成產(chǎn)生隨機碼,用作通信過程中對稱加密的密鑰,使用服務(wù)端返回的公鑰進行加密,將加密后的隨機碼發(fā)送至服務(wù)器;
服務(wù)器收到客戶端返回的加密信息后,使用自己的私鑰進行解密,獲取對稱加密密鑰;
在接下來的會話中,服務(wù)器和客戶端將會使用該密碼進行對稱加密,保證通信過程中信息的安全;
5. HTTPS雙向認(rèn)證
雙向認(rèn)證和單向認(rèn)證類似,它額外增加了服務(wù)端對客戶端的認(rèn)證:
客戶端向服務(wù)端發(fā)送SSL協(xié)議版本號、加密算法種類、隨機數(shù)等信息;
服務(wù)端給客戶端返回SSL協(xié)議版本號、加密算法種類、隨機數(shù)等信息,同時也返回服務(wù)器端的證書,即公鑰證書;
客戶端使用服務(wù)端返回的信息驗證服務(wù)器的合法性,包括:
證書是否過期;
發(fā)行服務(wù)器證書的CA是否可靠;(通過查詢?yōu)g覽器或本機內(nèi)的CA證書)
返回的公鑰是否能正確解開返回證書中的數(shù)字簽名;(通過使用本機或瀏覽器內(nèi)置的CA公鑰進行解密)
服務(wù)器證書上的域名是否和服務(wù)器的實際域名相匹配;
驗證通過后,將繼續(xù)進行通信,否則,終止通信;
服務(wù)端要求客戶端發(fā)送客戶端的證書即客戶端證書公鑰,客戶端會將自己的證書發(fā)送至服務(wù)端;
驗證客戶端的證書,通過驗證后,會獲得客戶端的公鑰;
客戶端向服務(wù)端發(fā)送自己所能支持的對稱加密方案,供服務(wù)器端進行選擇
服務(wù)器端在客戶端提供的加密方案中選擇加密程度最高的加密方式;
將加密方案通過使用之前獲取到的公鑰進行加密,返回給客戶端
客戶端收到服務(wù)端返回的加密方案密文后,使用自己的私鑰進行解密,獲取具體加密方式,而后,產(chǎn)生該加密方式的隨機碼,用作加密過程中的密鑰,使用之前從服務(wù)端證書中獲取到的公鑰進行加密后,發(fā)送給服務(wù)端;
服務(wù)端收到客戶端發(fā)送的消息后,使用自己的私鑰進行解密,獲取對稱加密的密鑰,在接下來的會話中,服務(wù)器和客戶端將會使用該密碼進行對稱加密,保證通信過程中信息的安全;
二、國密算法
基于Java的(SM2_SM3_SM4)國密算法, 加密解密工具類及測試demo
參考URL: https://blog.csdn.net/s78365126/article/details/83345954
國密即國家密碼局認(rèn)定的國產(chǎn)密碼算法。主要有SM1,SM2,SM3,SM4。密鑰長度和分組長度均為128位。
- SM1 為對稱加密。其加密強度與AES相當(dāng)。該算法不公開,調(diào)用該算法時,需要通過加密芯片的接口進行調(diào)用。
- SM2為非對稱加密,基于ECC。該算法已公開。由于該算法基于ECC,故其簽名速度與秘鑰生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一種)安全強度比RSA 2048位高,但運算速度快于RSA。
- SM3 消息摘要。可以用MD5作為對比理解。該算法已公開。校驗結(jié)果為256位。
- SM4 無線局域網(wǎng)標(biāo)準(zhǔn)的分組數(shù)據(jù)算法。對稱加密,密鑰長度和分組長度均為128位。
1. SM2算法
SM2算法對比RSA算法,有哪些優(yōu)勢?
參考URL: https://www.sohu.com/a/321040448_188485
SM2算法由國家密碼管理局于2010年12月17日發(fā)布,是我國自主設(shè)計的公鑰密碼算法,基于更加安全先進的橢圓曲線密碼機制,在國際標(biāo)準(zhǔn)的ECC橢圓曲線密碼理論基礎(chǔ)上進行自主研發(fā)設(shè)計,具備ECC算法的性能特點并實現(xiàn)優(yōu)化改進。
SM2橢圓曲線公鑰密碼算法是我國自主設(shè)計的公鑰密碼算法,包括SM2-1橢圓曲線數(shù)字簽名算法,SM2-2橢圓曲線密鑰交換協(xié)議,SM2-3橢圓曲線公鑰加密算法,分別用于實現(xiàn)數(shù)字簽名密鑰協(xié)商和數(shù)據(jù)加密等功能。SM2算法與RSA算法不同的是,SM2算法是基于橢圓曲線上點群離散對數(shù)難題,相對于RSA算法,256位的SM2密碼強度已經(jīng)比2048位的RSA密碼強度要高。
SM2算法和RSA算法都是公鑰密碼算法,SM2算法是一種更先進安全的算法,在安全性能、速度性能等方面都優(yōu)于RSA算法,在我國商用密碼體系中被用來替換RSA算法。國家密碼管理局于2010年12月17日發(fā)布了SM2算法,并要求現(xiàn)有的基于RSA算法的電子認(rèn)證系統(tǒng)、密鑰管理系統(tǒng)、應(yīng)用系統(tǒng)進升級改造,使用SM2算法。
目前,基于ECC的SM2證書普遍采用256位密鑰長度,加密強度等同于3072位RSA證書,遠(yuǎn)高于業(yè)界普遍采用的2048位RSA證書。
SM2算法的應(yīng)用推廣:
然而,由于國密算法尚未實現(xiàn)廣泛兼容,在主流瀏覽器、操作系統(tǒng)等終端環(huán)境中不受信任,面向互聯(lián)網(wǎng)的產(chǎn)品應(yīng)用中采用國產(chǎn)密碼算法將無法滿足可用性、易用性和全球通用性的需求,在實際應(yīng)用中很難真正落地實施。
2. SM3算法
SM3雜湊算法是我國自主設(shè)計的密碼雜湊算法,適用于商用密碼應(yīng)用中的數(shù)字簽名和驗證消息認(rèn)證碼的生成與驗證以及隨機數(shù)的生成,可滿足多種密碼應(yīng)用的安全需求。為了保證雜湊算法的安全性,其產(chǎn)生的雜湊值的長度不應(yīng)太短,例如MD5輸出128比特雜湊值,輸出長度太短,影響其安全性SHA-1算法的輸出長度為160比特,SM3算法的輸出長度為256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法
三、常用的國際加密算法 和國密算法 用途及原理對比
常用的國際加密算法 和國密算法 用途及原理對比
參考URL: https://kuaibao.qq.com/s/20180331G0J8Q300?refer=spider
SM2算法對比RSA算法,有哪些優(yōu)勢?
參考URL: https://www.sohu.com/a/321040448_188485
四、java.security包
官網(wǎng):
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安全技術(shù)包括大量api、工具和常用安全算法、機制和協(xié)議的實現(xiàn)。java security api涉及很多領(lǐng)域,包括密碼學(xué)、公鑰基礎(chǔ)設(shè)施、安全通信、身份驗證和訪問控制。Java安全技術(shù)為開發(fā)人員提供了編寫應(yīng)用程序的全面安全框架,也為用戶或管理員提供了一套安全管理應(yīng)用程序的工具。
1. Java安全類和接口的名稱、包和用法
官網(wǎng)https://docs.oracle.com/javase/8/docs/technotes/guides/security/overview/jsoverview.html
Java安全類和接口的名稱、包和用法。
公私鑰相關(guān)類和接口
Key包括公鑰(PublicKey)、私鑰(PrivateKey)兩種。
PrivateKey接口
官網(wǎng): 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
證書相關(guān)類
類 java.security.cert.Certificate
類 X509Certificate
X.509 證書的抽象類。
2. java操作x509數(shù)字證書
java操作x509數(shù)字證書
參考URL: https://blog.csdn.net/do_bset_yourself/article/details/78159697
五、第三方庫:BouncyCastle(輕量級密碼術(shù)包)
BouncyCastle
參考URL: https://www.liaoxuefeng.com/wiki/1252599548343744/1305362418368545
Java標(biāo)準(zhǔn)庫提供了一系列常用的哈希算法。
但如果我們要用的某種算法,Java標(biāo)準(zhǔn)庫沒有提供怎么辦?
BouncyCastle就是一個提供了很多哈希算法和加密算法的第三方庫。它提供了Java標(biāo)準(zhǔn)庫沒有的一些算法,例如,RipeMD160哈希算法。
BC指Bouncy Castle, CC指Commons Codec都是第三方拓展包。
**Java標(biāo)準(zhǔn)庫的java.security包提供了一種標(biāo)準(zhǔn)機制,允許第三方提供商無縫接入。**我們要使用BouncyCastle提供的RipeMD160算法,需要先把BouncyCastle注冊一下:
public class Main {public static void main(String[] args) throws Exception {// 注冊BouncyCastle:Security.addProvider(new BouncyCastleProvider());// 按名稱正常調(diào)用: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是通過下面的語句實現(xiàn)的:
Security.addProvider(new BouncyCastleProvider());注冊只需要在啟動時進行一次,后續(xù)就可以使用BouncyCastle提供的所有哈希算法和加密算法。
總結(jié): BouncyCastle是一個開源的第三方算法提供商;
BouncyCastle提供了很多Java標(biāo)準(zhǔn)庫沒有提供的哈希算法和加密算法;
使用第三方算法前需要通過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 出現(xiàn)之前,Spring Security 就已經(jīng)發(fā)展了多年了,但是使用的并不多,安全管理這個領(lǐng)域,一直是 Shiro 的天下。
相對于 Shiro,在 SSM/SSH 中整合 Spring Security 都是比較麻煩的操作,所以,Spring Security 雖然功能比 Shiro 強大,但是使用反而沒有 Shiro 多(Shiro 雖然功能沒有 Spring Security 多,但是對于大部分項目而言,Shiro 也夠用了)。
自從有了 Spring Boot 之后,Spring Boot 對于 Spring Security 提供了 自動化配置方案,可以零配置使用 Spring Security。
因此,一般來說,常見的安全管理技術(shù)棧的組合是這樣的:
SSM + Shiro Spring Boot/Spring Cloud + Spring Security2. BCryptPasswordEncoder方法
Spring security中的BCryptPasswordEncoder方法對密碼進行加密與密碼匹配
參考URL: https://www.jianshu.com/p/89c4c476e189
Spring Security 中提供了 BCryptPasswordEncoder 密碼編碼工具,可以非常方便的實現(xiàn)密碼的加密加鹽,相同明文加密出來的結(jié)果總是不同,這樣就不需要用戶去額外保存鹽的字段了。
使用場景:用于用戶密碼的加密和解密。
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中,前部分已經(jīng)包含了鹽信息。
3. spring boot 中使用 Spring Security
手把手帶你入門 Spring Security!
參考URL: https://www.cnblogs.com/lenve/p/11242055.html
推薦參考 參考URL原作者內(nèi)容,寫的比較詳細(xì),可參考。
總結(jié)
以上是生活随笔為你收集整理的java安全相关类 (java.security包)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】Spring Boot 过滤器、
- 下一篇: 中国石油大计算机在线考试中心,中国石油大