日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java安全相关类 (java.security包)

發(fā)布時間:2023/12/10 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java安全相关类 (java.security包) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 一、安全基礎(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 Security

    2. 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。