成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java.security.Provider 源碼學(xué)習(xí)筆記

quietin / 1648人閱讀

摘要:內(nèi)部類提供本服務(wù)的服務(wù)的類型算法名稱本服務(wù)的實(shí)現(xiàn)類的名稱別名列表空如果服務(wù)沒有別名屬性映射空如果實(shí)現(xiàn)沒有屬性以的算法為例輸出的結(jié)果其中查看支持的密鑰類型繼承類函數(shù)前三種是類的全路徑名稱帶有后三種中的方法返回中所有的條目返回中所有的條目中

java.security.Provider 內(nèi)部類Service
/**
* Construct a new service.
*
* @param provider     提供本服務(wù)的Provider
* @param type         服務(wù)的類型
* @param algorithm     算法名稱
* @param className     本服務(wù)的實(shí)現(xiàn)類的名稱
* @param aliases     別名列表|空(如果服務(wù)沒有別名)
* @param attributes 屬性映射|空(如果實(shí)現(xiàn)沒有屬性)
*
* @throws NullPointerException if provider, type, algorithm, or
* className is null
*/
public Service(Provider provider, String type, String algorithm,
    String className, List aliases, Map attributes)

以BC的RSA算法為例toString()輸出的結(jié)果

BC: Cipher.RSA -> org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi$NoPadding
  aliases: [RSA//RAW, RSA//NOPADDING]
  attributes: {SupportedKeyFormats=PKCS#8|X.509, SupportedKeyClasses=javax.crypto.interfaces.RSAPublicKey|javax.crypto.interfaces.RSAPrivateKey}

BC: Cipher.RSA/OAEP -> org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi$OAEPPadding
  aliases: [RSA//OAEPPADDING]

其中:

Service.className = org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi$NoPadding

Service.type = Cipher

Service.algorithm = RSA

查看支持的密鑰類型:

public boolean supportsParameter(Object parameter)

attributes:SupportedKeyFormats=PKCS#8|X.509

繼承Properties類

函數(shù)put

Key=

type.algorithm

type.oid

type.OID.oid

Alg.Alias.type.algorithm

Alg.Alias.type.oid

Alg.Alias.type.OID.oid

value = className

key = type.algorithm(前三種),value是spi類的全路徑名稱

key = 帶有Alg.Alias..(后三種),value = type.algorithm中的algorithm.

方法

返回Provider中所有的property條目Set

public synchronized Set> entrySet()

返回Provider中所有的Property條目中的Set

public Set keySet() 

返回Provider中所有的Property條目中的Collection

public Collection values()

根據(jù)Type和algorithm獲取Service

public synchronized Service getService(String type, String algorithm)

繼承自Property的函數(shù)

添加
public synchronized Object put(Object key, Object value)
public synchronized void putAll(Map t)

刪除
public synchronized Object remove(Object key)
public synchronized void clear()

獲取
public Object get(Object key)
public String getProperty(String key)

type,algorithm到service的轉(zhuǎn)換
provider.put(key,value)
name = key,value = value
private void parseLegacyPut(String name, String value) {
    if (name.toLowerCase(ENGLISH).startsWith(ALIAS_PREFIX_LOWER)) {
        // e.g. put("Alg.Alias.MessageDigest.SHA", "SHA-1");
        // aliasKey ~ MessageDigest.SHA
        String stdAlg = value;
        String aliasKey = name.substring(ALIAS_LENGTH);
        String[] typeAndAlg = getTypeAndAlgorithm(aliasKey);
        if (typeAndAlg == null) {
            return;
        }
        String type = getEngineName(typeAndAlg[0]);
        String aliasAlg = typeAndAlg[1].intern();
        ServiceKey key = new ServiceKey(type, stdAlg, true);
        Service s = legacyMap.get(key);
        if (s == null) {
            s = new Service(this);
            s.type = type;
            s.algorithm = stdAlg;
            legacyMap.put(key, s);
        }
        legacyMap.put(new ServiceKey(type, aliasAlg, true), s);
        s.addAlias(aliasAlg);
    } else {
        String[] typeAndAlg = getTypeAndAlgorithm(name);
        if (typeAndAlg == null) {
            return;
        }
        int i = typeAndAlg[1].indexOf(" ");
        if (i == -1) {
            // e.g. put("MessageDigest.SHA-1", "sun.security.provider.SHA");
            String type = getEngineName(typeAndAlg[0]);
            String stdAlg = typeAndAlg[1].intern();
            String className = value;
            ServiceKey key = new ServiceKey(type, stdAlg, true);
            Service s = legacyMap.get(key);
            if (s == null) {
                s = new Service(this);
                s.type = type;
                s.algorithm = stdAlg;
                legacyMap.put(key, s);
            }
            s.className = className;
        } else { // attribute
            // e.g. put("MessageDigest.SHA-1 ImplementedIn", "Software");
            String attributeValue = value;
            String type = getEngineName(typeAndAlg[0]);
            String attributeString = typeAndAlg[1];
            String stdAlg = attributeString.substring(0, i).intern();
            String attributeName = attributeString.substring(i + 1);
            // kill additional spaces
            while (attributeName.startsWith(" ")) {
                attributeName = attributeName.substring(1);
            }
            attributeName = attributeName.intern();
            ServiceKey key = new ServiceKey(type, stdAlg, true);
            Service s = legacyMap.get(key);
            if (s == null) {
                s = new Service(this);
                s.type = type;
                s.algorithm = stdAlg;
                legacyMap.put(key, s);
            }
            s.addAttribute(attributeName, attributeValue);
        }
    }
}

調(diào)用parseLegacyPut(),實(shí)際是將type,algorithm等轉(zhuǎn)換成Map legacyMap;

引擎類在getInstance()的時(shí)候去調(diào)用Provider.getService(type,algorithm)方法,通過ServiceKey(type,algorithm)獲取到Service.
然后在引擎類的getInstance()中調(diào)用service.newInstance()返回引擎類spi的實(shí)例

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76920.html

相關(guān)文章

  • 【LNMPR源碼學(xué)習(xí)筆記匯總

    摘要:此文用于匯總跟隨陳雷老師及團(tuán)隊(duì)的視頻,學(xué)習(xí)源碼過程中的思考整理與心得體會(huì),此文會(huì)不斷更新視頻傳送門每日學(xué)習(xí)記錄使用錄像設(shè)備記錄每天的學(xué)習(xí)源碼學(xué)習(xí)源碼學(xué)習(xí)內(nèi)存管理筆記源碼學(xué)習(xí)內(nèi)存管理筆記源碼學(xué)習(xí)內(nèi)存管理筆記源碼學(xué)習(xí)基本變量筆記 此文用于匯總跟隨陳雷老師及團(tuán)隊(duì)的視頻,學(xué)習(xí)源碼過程中的思考、整理與心得體會(huì),此文會(huì)不斷更新 視頻傳送門:【每日學(xué)習(xí)記錄】使用錄像設(shè)備記錄每天的學(xué)習(xí) PHP7...

    Barrior 評(píng)論0 收藏0
  • Laravel學(xué)習(xí)筆記之Container源碼解析

    摘要:實(shí)際上的綁定主要有三種方式且只是一種的,這些已經(jīng)在學(xué)習(xí)筆記之實(shí)例化源碼解析聊過,其實(shí)現(xiàn)方法并不復(fù)雜。從以上源碼發(fā)現(xiàn)的反射是個(gè)很好用的技術(shù),這里給出個(gè),看下能干些啥打印結(jié)果太長(zhǎng)了,就不粘貼了。 說明:本文主要學(xué)習(xí)Laravel中Container的源碼,主要學(xué)習(xí)Container的綁定和解析過程,和解析過程中的依賴解決。分享自己的研究心得,希望對(duì)別人有所幫助。實(shí)際上Container的綁...

    huayeluoliuhen 評(píng)論0 收藏0
  • Java concurrent 源碼學(xué)習(xí)筆記1 - 概覽

    摘要:源碼學(xué)習(xí)筆記基于包源碼大致分為以下幾組對(duì)包集合框架的擴(kuò)展更好的支持多線程并發(fā)操作線程池相關(guān)鎖基本數(shù)據(jù)類型的原子性封裝 Java concurrent 源碼學(xué)習(xí)筆記基于JDK1.8 concurrent包源碼大致分為以下幾組: 對(duì)util包集合框架的擴(kuò)展(更好的支持多線程并發(fā)操作) 線程池相關(guān) 鎖 基本數(shù)據(jù)類型的原子性封裝 showImg(https://segmentfault.c...

    CocoaChina 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<