java加密類型和演算法名稱

来源:http://www.cnblogs.com/andong2015/archive/2016/07/15/5674293.html
-Advertisement-
Play Games

項目里有各種加密方法,但從來沒有仔細研究過。一般只是copy。這幾天遇到一些問題,看了一下加密代碼,覺得有些疑惑。 我們知道jdk已經為我們包裝好了很多的演算法。但究竟包裝了哪些演算法,怎麼去掉這些演算法我並沒有去查過。今天跟了一下源碼,大概知道了。 首先要從下麵這幾行代碼說起: 對於AES加密,我們用K ...


    項目里有各種加密方法,但從來沒有仔細研究過。一般只是copy。這幾天遇到一些問題,看了一下加密代碼,覺得有些疑惑。

    我們知道jdk已經為我們包裝好了很多的演算法。但究竟包裝了哪些演算法,怎麼去掉這些演算法我並沒有去查過。今天跟了一下源碼,大概知道了。

    首先要從下麵這幾行代碼說起:

KeyGenerator kgen = KeyGenerator.getInstance("AES");

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");

java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");

    對於AES加密,我們用KeyGenerator kgen = KeyGenerator.getInstance("AES");,MD5我們用java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");,這裡從方法上看出java類是通過一個演算法名稱去找的,比如AES,但源碼中並沒有把演算法名稱包裝為枚舉,我們無法得知KeyGenerator除了有AES演算法,還能獲得那些演算法,而且如何獲得KeyGenerator的演算法名稱,比如AES不全是大寫會不會有問題,KeyGenerator是不是有MD5等等。

    打開KeyGenerator.getInstance()方法,看其源碼

 

public static final KeyGenerator getInstance(String paramString)
    throws NoSuchAlgorithmException
  {
    return new KeyGenerator(paramString);
  }

 

    我們發現直接調用了構造方法,查看構造方法:

  private KeyGenerator(String paramString)
    throws NoSuchAlgorithmException
  {
    this.algorithm = paramString;
    
    List localList = GetInstance.getServices("KeyGenerator", paramString);
    this.serviceIterator = localList.iterator();
    this.initType = 1;
    if (nextSpi(null, false) == null) {
      throw new NoSuchAlgorithmException(paramString + " KeyGenerator not available");
    }
    if ((!skipDebug) && (pdebug != null)) {
      pdebug.println("KeyGenerator." + paramString + " algorithm from: " + this.provider
        .getName());
    }
  }
  

    構造方法其實是通過GetInstance.getServices("KeyGenerator", paramString)去找到,繼續跟進

  public Provider.Service getService(String paramString1, String paramString2)
  {
    for (int i = 0; i < this.configs.length; i++)
    {
      Provider localProvider = getProvider(i);
      Provider.Service localService = localProvider.getService(paramString1, paramString2);
      if (localService != null) {
        return localService;
      }
    }
    return null;
  }

    GetInstance.getServices其實是遍歷所有的Provider,然後按順序返回第一個有這個演算法服務的Provide的演算法服務(Provider.Service)。這裡可以看出,尋找服務需要兩個參數,第一個參數是type,比如"KeyGenerator",第二個是演算法名稱,“AES”。那現在我們只要知道有哪些Provide,每個Provide里有哪些Provider.Service就可以了。

    在jdk的API中,查看 KeyGenerator.getInstance方法,其中給了我們提示:

 

    我們可以本地寫一個方法遍歷jdk所有的演算法:

package com.hongkang.test;

import java.security.Provider;
import java.security.Security;
import java.security.Provider.Service;

public class TestSecurity {

    public static void main(String[] args) {
        Provider[] providers = Security.getProviders();
        for(Provider p:providers){
            System.out.println("provider name:"+p.getName());
            for(Service s:p.getServices()){
                System.out.println("類型:"+s.getType()+",演算法:"+s.getAlgorithm());
            }
            System.out.println("--------------------------");
        }
    }
}

輸出結果:

provider name:SUN
類型:SecureRandom,演算法:SHA1PRNG
類型:Signature,演算法:SHA1withDSA
類型:Signature,演算法:NONEwithDSA
類型:KeyPairGenerator,演算法:DSA
類型:MessageDigest,演算法:MD2
類型:MessageDigest,演算法:MD5
類型:MessageDigest,演算法:SHA
類型:MessageDigest,演算法:SHA-256
類型:MessageDigest,演算法:SHA-384
類型:MessageDigest,演算法:SHA-512
類型:AlgorithmParameterGenerator,演算法:DSA
類型:AlgorithmParameters,演算法:DSA
類型:KeyFactory,演算法:DSA
類型:CertificateFactory,演算法:X.509
類型:KeyStore,演算法:JKS
類型:KeyStore,演算法:CaseExactJKS
類型:Policy,演算法:JavaPolicy
類型:Configuration,演算法:JavaLoginConfig
類型:CertPathBuilder,演算法:PKIX
類型:CertPathValidator,演算法:PKIX
類型:CertStore,演算法:LDAP
類型:CertStore,演算法:Collection
類型:CertStore,演算法:com.sun.security.IndexedCollection
--------------------------
provider name:SunRsaSign
類型:KeyFactory,演算法:RSA
類型:KeyPairGenerator,演算法:RSA
類型:Signature,演算法:MD2withRSA
類型:Signature,演算法:MD5withRSA
類型:Signature,演算法:SHA1withRSA
類型:Signature,演算法:SHA256withRSA
類型:Signature,演算法:SHA384withRSA
類型:Signature,演算法:SHA512withRSA
--------------------------
provider name:SunEC
類型:KeyFactory,演算法:EC
類型:AlgorithmParameters,演算法:EC
類型:Signature,演算法:NONEwithECDSA
類型:Signature,演算法:SHA1withECDSA
類型:Signature,演算法:SHA256withECDSA
類型:Signature,演算法:SHA384withECDSA
類型:Signature,演算法:SHA512withECDSA
類型:KeyPairGenerator,演算法:EC
類型:KeyAgreement,演算法:ECDH
--------------------------
provider name:SunJSSE
類型:KeyFactory,演算法:RSA
類型:KeyPairGenerator,演算法:RSA
類型:Signature,演算法:MD2withRSA
類型:Signature,演算法:MD5withRSA
類型:Signature,演算法:SHA1withRSA
類型:Signature,演算法:MD5andSHA1withRSA
類型:KeyManagerFactory,演算法:SunX509
類型:KeyManagerFactory,演算法:NewSunX509
類型:TrustManagerFactory,演算法:SunX509
類型:TrustManagerFactory,演算法:PKIX
類型:SSLContext,演算法:TLSv1
類型:SSLContext,演算法:TLSv1.1
類型:SSLContext,演算法:TLSv1.2
類型:SSLContext,演算法:Default
類型:KeyStore,演算法:PKCS12
--------------------------
provider name:SunJCE
類型:Cipher,演算法:RSA
類型:Cipher,演算法:DES
類型:Cipher,演算法:DESede
類型:Cipher,演算法:DESedeWrap
類型:Cipher,演算法:PBEWithMD5AndDES
類型:Cipher,演算法:PBEWithMD5AndTripleDES
類型:Cipher,演算法:PBEWithSHA1AndRC2_40
類型:Cipher,演算法:PBEWithSHA1AndDESede
類型:Cipher,演算法:Blowfish
類型:Cipher,演算法:AES
類型:Cipher,演算法:AESWrap
類型:Cipher,演算法:RC2
類型:Cipher,演算法:ARCFOUR
類型:KeyGenerator,演算法:DES
類型:KeyGenerator,演算法:DESede
類型:KeyGenerator,演算法:Blowfish
類型:KeyGenerator,演算法:AES
類型:KeyGenerator,演算法:RC2
類型:KeyGenerator,演算法:ARCFOUR
類型:KeyGenerator,演算法:HmacMD5
類型:KeyGenerator,演算法:HmacSHA1
類型:KeyGenerator,演算法:HmacSHA256
類型:KeyGenerator,演算法:HmacSHA384
類型:KeyGenerator,演算法:HmacSHA512
類型:KeyPairGenerator,演算法:DiffieHellman
類型:AlgorithmParameterGenerator,演算法:DiffieHellman
類型:KeyAgreement,演算法:DiffieHellman
類型:AlgorithmParameters,演算法:DiffieHellman
類型:AlgorithmParameters,演算法:DES
類型:AlgorithmParameters,演算法:DESede
類型:AlgorithmParameters,演算法:PBE
類型:AlgorithmParameters,演算法:PBEWithMD5AndDES
類型:AlgorithmParameters,演算法:PBEWithMD5AndTripleDES
類型:AlgorithmParameters,演算法:PBEWithSHA1AndDESede
類型:AlgorithmParameters,演算法:PBEWithSHA1AndRC2_40
類型:AlgorithmParameters,演算法:Blowfish
類型:AlgorithmParameters,演算法:AES
類型:AlgorithmParameters,演算法:RC2
類型:AlgorithmParameters,演算法:OAEP
類型:KeyFactory,演算法:DiffieHellman
類型:SecretKeyFactory,演算法:DES
類型:SecretKeyFactory,演算法:DESede
類型:SecretKeyFactory,演算法:PBEWithMD5AndDES
類型:SecretKeyFactory,演算法:PBEWithMD5AndTripleDES
類型:SecretKeyFactory,演算法:PBEWithSHA1AndDESede
類型:SecretKeyFactory,演算法:PBEWithSHA1AndRC2_40
類型:SecretKeyFactory,演算法:PBKDF2WithHmacSHA1
類型:Mac,演算法:HmacMD5
類型:Mac,演算法:HmacSHA1
類型:Mac,演算法:HmacSHA256
類型:Mac,演算法:HmacSHA384
類型:Mac,演算法:HmacSHA512
類型:Mac,演算法:HmacPBESHA1
類型:Mac,演算法:SslMacMD5
類型:Mac,演算法:SslMacSHA1
類型:KeyStore,演算法:JCEKS
類型:KeyGenerator,演算法:SunTlsPrf
類型:KeyGenerator,演算法:SunTls12Prf
類型:KeyGenerator,演算法:SunTlsMasterSecret
類型:KeyGenerator,演算法:SunTlsKeyMaterial
類型:KeyGenerator,演算法:SunTlsRsaPremasterSecret
--------------------------
provider name:SunJGSS
類型:GssApiMechanism,演算法:1.2.840.113554.1.2.2
類型:GssApiMechanism,演算法:1.3.6.1.5.5.2
--------------------------
provider name:SunSASL
類型:SaslClientFactory,演算法:DIGEST-MD5
類型:SaslClientFactory,演算法:NTLM
類型:SaslClientFactory,演算法:GSSAPI
類型:SaslClientFactory,演算法:EXTERNAL
類型:SaslClientFactory,演算法:PLAIN
類型:SaslClientFactory,演算法:CRAM-MD5
類型:SaslServerFactory,演算法:CRAM-MD5
類型:SaslServerFactory,演算法:GSSAPI
類型:SaslServerFactory,演算法:DIGEST-MD5
類型:SaslServerFactory,演算法:NTLM
--------------------------
provider name:XMLDSig
類型:TransformService,演算法:http://www.w3.org/2002/06/xmldsig-filter2
類型:TransformService,演算法:http://www.w3.org/2000/09/xmldsig#enveloped-signature
類型:TransformService,演算法:http://www.w3.org/2001/10/xml-exc-c14n#WithComments
類型:TransformService,演算法:http://www.w3.org/2001/10/xml-exc-c14n#
類型:TransformService,演算法:http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments
類型:XMLSignatureFactory,演算法:DOM
類型:TransformService,演算法:http://www.w3.org/2006/12/xml-c14n11
類型:TransformService,演算法:http://www.w3.org/2000/09/xmldsig#base64
類型:TransformService,演算法:http://www.w3.org/TR/2001/REC-xml-c14n-20010315
類型:TransformService,演算法:http://www.w3.org/TR/1999/REC-xpath-19991116
類型:TransformService,演算法:http://www.w3.org/TR/1999/REC-xslt-19991116
類型:TransformService,演算法:http://www.w3.org/2006/12/xml-c14n11#WithComments
類型:KeyInfoFactory,演算法:DOM
--------------------------
provider name:SunPCSC
類型:TerminalFactory,演算法:PC/SC
--------------------------
provider name:SunMSCAPI
類型:SecureRandom,演算法:Windows-PRNG
類型:KeyStore,演算法:Windows-MY
類型:KeyStore,演算法:Windows-ROOT
類型:Signature,演算法:NONEwithRSA
類型:Signature,演算法:SHA1withRSA
類型:Signature,演算法:SHA256withRSA
類型:Signature,演算法:SHA384withRSA
類型:Signature,演算法:SHA512withRSA
類型:Signature,演算法:MD5withRSA
類型:Signature,演算法:MD2withRSA
類型:KeyPairGenerator,演算法:RSA
類型:Cipher,演算法:RSA
類型:Cipher,演算法:RSA/ECB/PKCS1Padding
--------------------------

通過觀察,我們發現演算法的類型,基本都對應java的一個類。演算法類基本在jce.jar和rt.jar中。從這個結果中我們基本就能自己找演算法了,比如要用MD5,在上面列表中發現類型是MessageDigest,則

MessageDigest md5 = MessageDigest.getInstance("MD5");

再仔細查看java.security.Provider類源碼,發現此類在初始時就已經將這些演算法類型初始化了,

 static
  {
    addEngine("AlgorithmParameterGenerator", false, null);
    addEngine("AlgorithmParameters", false, null);
    addEngine("KeyFactory", false, null);
    addEngine("KeyPairGenerator", false, null);
    addEngine("KeyStore", false, null);
    addEngine("MessageDigest", false, null);
    addEngine("SecureRandom", false, null);
    addEngine("Signature", true, null);
    addEngine("CertificateFactory", false, null);
    addEngine("CertPathBuilder", false, null);
    addEngine("CertPathValidator", false, null);
    addEngine("CertStore", false, "java.security.cert.CertStoreParameters");
    addEngine("Cipher", true, null);
    addEngine("ExemptionMechanism", false, null);
    addEngine("Mac", true, null);
    addEngine("KeyAgreement", true, null);
    addEngine("KeyGenerator", false, null);
    addEngine("SecretKeyFactory", false, null);
    addEngine("KeyManagerFactory", false, null);
    addEngine("SSLContext", false, null);
    addEngine("TrustManagerFactory", false, null);
    addEngine("GssApiMechanism", false, null);
    addEngine("SaslClientFactory", false, null);
    addEngine("SaslServerFactory", false, null);
    addEngine("Policy", false, "java.security.Policy$Parameters");
    addEngine("Configuration", false, "javax.security.auth.login.Configuration$Parameters");
    addEngine("XMLSignatureFactory", false, null);
    addEngine("KeyInfoFactory", false, null);
    addEngine("TransformService", false, null);
    addEngine("TerminalFactory", false, "java.lang.Object");
  }

//還對大小寫做了容錯處理
  private static void addEngine(String paramString1, boolean paramBoolean, String paramString2)
  {
    EngineDescription localEngineDescription = new EngineDescription(paramString1, paramBoolean, paramString2);
    knownEngines.put(paramString1.toLowerCase(Locale.ENGLISH), localEngineDescription);
    knownEngines.put(paramString1, localEngineDescription);
  }

不過遺憾的是並沒有找到AES這類演算法是怎麼初始化的。但是經測試,即便使用的不是大寫,或者上面列表中列出的標準寫法,也能正常獲取,比如:

KeyGenerator kgen = KeyGenerator.getInstance("aEs");

也能正常執行。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.Yeoman? yeoman是一個自動化腳手架工具。它提供很多generator,generator相當於VisualStudio的模板,用來初始化項目。更多的就不多說了,寫一遍都寫不完,自己看吧。 http://yeoman.io/ 2.安裝 yeoman 安裝yeoman之前你需要先安裝np ...
  • 一、EasyUI 基本的拖動和放置 直接代碼看: 二、購物車 三、課程表 ...
  • 1.兩個拷貝之間主要是用於對象之間的拷貝! 2.區別 沒指針: 深拷貝和淺拷貝沒什麼區別; 有指針: 淺拷貝:即對象的預設拷貝函數,只是將指針的地址拷貝給對象,兩個變數同時指向一個地址,這樣在析構的時候必然會導致程式崩潰; 深拷貝:即要自定義拷貝函數,將指針new一段新記憶體保存起來;這樣析構也不會崩 ...
  • 這是本學期java課中實驗大綱里的第一個實驗,這裡簡單做了一個無用戶界面版本。 能看到判斷對錯的方法運用了直接運算符計算結果與函數定義後的運算結果相比較,相等得分,不相等則不得分。 編程中出現的問題:在計算結果為小數的除法時,一開始會出現結果怎麼算都不對的情況,他的正確答案也是一個向偶舍入的數值,那 ...
  • 直接插入排序 直接插入排序是一種簡單的插入排序法,其基本思想是:把待排序的紀錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的紀錄插入完為止,得到一個新的有序序列。[1] 例如,已知待排序的一組紀錄是: 60,71,49,11,24,3,66 假設在排序過程中,前3個紀錄已按關鍵碼 ...
  • 最近遇到的關於VS里編譯出現的“無法解析的外部符號”問題,在網上尋求解決辦=辦法時查到下麵的博客內容,作者講解的挺全面的,作為收藏以備將來查詢。 原文http://blog.csdn.net/shenyulv/article/details/6699836 VC++時經常會遇到鏈接錯誤LNK2001 ...
  • 從誕生至今,20多年過去,Java至今仍是使用最為廣泛的語言。這仰賴於Java提供的各種技術和特性,讓開發人員能優雅的編寫高效的程式。今天我們就來說說Java的一項基本但非常重要的技術記憶體管理 瞭解C語言的同學都知道,在C語言中記憶體的開闢和釋放都是由我們自己來管理的,每一個new操作都要對於一個de ...
  • scalaz-stream庫的主要設計目標是實現函數式的I/O編程(functional I/O)。這樣用戶就能使用功能單一的基礎I/O函數組合成為功能完整的I/O程式。還有一個目標就是保證資源的安全使用(resource safety):使用scalaz-stream編寫的I/O程式能確保資源的安 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...