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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

在Java应用程序中使用密码学

發(fā)布時(shí)間:2023/12/3 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Java应用程序中使用密码学 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇文章描述了如何使用Java密碼體系結(jié)構(gòu) (JCA),該體系結(jié)構(gòu)使您可以在應(yīng)用程序中使用密碼服務(wù)。

Java密碼體系結(jié)構(gòu)服務(wù)

JCA提供了許多加密服務(wù),例如消息摘要和簽名 。

這些服務(wù)可以通過(guò)特定于服務(wù)的API來(lái)訪問(wèn),例如MessageDigest和Signature 。

密碼服務(wù)抽象了不同的算法。 例如,對(duì)于摘要,可以使用MD5或SHA1 。 您可以將算法指定為加密服務(wù)類的getInstance()方法的參數(shù):

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

您可以在“ JCA 標(biāo)準(zhǔn)算法名稱文檔”中找到算法參數(shù)的值。

一些算法具有參數(shù)。 例如,生成私鑰/公鑰對(duì)的算法將把密鑰大小作為參數(shù)。 您可以使用initialize()方法指定參數(shù):

KeyPairGenerator generator = KeyPairGenerator.getInstance("DSA"); generator.initialize(1024);

如果不調(diào)用initialize()方法,則將使用某些默認(rèn)值,該默認(rèn)值可能是您想要的,也可能不是。

不幸的是,用于初始化的API在服務(wù)之間并非100%一致。

例如, Cipher類將init()與指示加密或解密的參數(shù)一起使用,而Signature類將initSign()用于簽名, initVerify()用于驗(yàn)證。

Java密碼體系結(jié)構(gòu)提供程序

JCA通過(guò)提供程序系統(tǒng)使您的代碼獨(dú)立于特定密碼算法的實(shí)現(xiàn)。

提供商根據(jù)可配置的首選項(xiàng)順序進(jìn)行排名(請(qǐng)參見(jiàn)下文)。 最佳優(yōu)先級(jí)是1,次佳是2,依此類推。優(yōu)先級(jí)順序允許JCA選擇實(shí)現(xiàn)給定算法的最佳可用提供程序。

另外,您可以在getInstance()的第二個(gè)參數(shù)中指定特定的提供程序:

Signature signature = Signature.getInstance("SHA1withDSA", "SUN");

默認(rèn)情況下,JRE附帶了來(lái)自O(shè)racle的一堆提供程序 。 但是,由于歷史上的出口限制,這些并不是最安全的實(shí)現(xiàn)。 要獲得更好的算法和更大的密鑰大小,請(qǐng)安裝Java密碼學(xué)擴(kuò)展無(wú)限強(qiáng)度管轄權(quán)策略文件 。

更新 :請(qǐng)注意,以上聲明對(duì)Oracle JRE是正確的。 OpenJDK沒(méi)有相同的限制 。

使您可以對(duì)密碼學(xué)進(jìn)行配置

您應(yīng)始終確保應(yīng)用程序使用的加密服務(wù)是可配置的。

如果這樣做,則可以在不發(fā)布補(bǔ)丁的情況下更改密碼算法和/或?qū)崿F(xiàn)。

當(dāng)對(duì)(一種實(shí)現(xiàn))算法有新的攻擊時(shí),這特別有價(jià)值。

JCA使配置加密的使用變得容易。

getInstance()方法同時(shí)接受算法的名稱和實(shí)現(xiàn)該算法的提供程序的名稱。 您應(yīng)該從某種配置文件中讀取算法參數(shù)的值和所有值。

還要確保將代碼DRY保留在一個(gè)地方并實(shí)例化加密服務(wù)。

檢查所請(qǐng)求的算法和/或提供程序是否實(shí)際可用。

當(dāng)給定的算法或提供程序不可用時(shí), getInstance()方法將引發(fā)NoSuchAlgorithmException ,因此您應(yīng)該捕獲該異常。 然后最安全的選擇是失敗,并請(qǐng)他人確保系統(tǒng)配置正確。 如果在配置錯(cuò)誤的情況下仍然繼續(xù),則可能會(huì)導(dǎo)致系統(tǒng)安全性低于要求。

請(qǐng)注意, Oracle建議不要指定提供程序 。 它們提供的原因是,并非所有提供程序都可以在所有平臺(tái)上使用,并且指定提供程序可能意味著您錯(cuò)過(guò)了優(yōu)化。

您應(yīng)該權(quán)衡這些不利因素和易受攻擊的風(fēng)險(xiǎn)。

在您的應(yīng)用程序中部署具有已知特征的特定提供程序可能會(huì)消除Oracle提到的缺點(diǎn)。

添加加密服務(wù)提供商

提供程序系統(tǒng)是可擴(kuò)展的,因此您可以添加提供程序。

例如,您可以使用開(kāi)源Bouncy Castle或商業(yè)RSA BSAFE提供程序。

為了添加提供程序,必須確保其jar對(duì)應(yīng)用程序可用。 為此,您可以將其放在類路徑中。

另外,您可以通過(guò)將其放置在$JAVA_HOME/lib/ext目錄中來(lái)使其成為已安裝的擴(kuò)展 ,其中$JAVA_HOME是JDK / JRE發(fā)行版的位置。

兩種方法之間的主要區(qū)別在于,默認(rèn)情況下, 已授予安裝的擴(kuò)展所有權(quán)限 ,而classpath上的代碼則未被授予 。 當(dāng)您的代碼(的一部分)在沙盒中運(yùn)行時(shí),這非常重要。

某些服務(wù)(例如Cipher )要求對(duì)提供者jar進(jìn)行簽名 。

下一步是在JCA提供者系統(tǒng)中注冊(cè)提供者。 最簡(jiǎn)單的方法是使用Security.addProvider() :

Security.addProvider(new BouncyCastleProvider());

您還可以使用Security.insertProviderAt()方法設(shè)置提供者的優(yōu)先順序:

Security.insertProviderAt (new JsafeJCE(), 1);

這種方法的一個(gè)缺點(diǎn)是,它將代碼耦合到提供程序,因?yàn)槟仨殞?dǎo)入提供程序類。 在像OSGi這樣的模塊化系統(tǒng)中,這可能不是重要的問(wèn)題。

需要注意的另一件事是代碼需要SecurityPermission以編程方式添加提供程序。

通過(guò)將注冊(cè)項(xiàng)添加到j(luò)ava.security屬性文件(可在$JAVA_HOME/jre/lib/security/java.security找到),還可以通過(guò)靜態(tài)注冊(cè)將提供程序配置為您環(huán)境的一部分:

security.provider.1=com.rsa.jsafe.provider.JsafeJCE security.provider.2=sun.security.provider.Sun

該文件中的屬性名稱以security.provider.開(kāi)頭security.provider. 并以提供者的偏好結(jié)束。 該屬性值是實(shí)現(xiàn)Provider的類的完全限定名稱。

實(shí)施您自己的加密服務(wù)提供商

不要這樣做 。 您會(huì)弄錯(cuò)它,并且容易受到攻擊。

使用加密服務(wù)提供者

提供程序的文檔應(yīng)告訴您將哪個(gè)提供程序名稱用作getInstance()的第二個(gè)參數(shù)。 例如,Bouncy Castle使用BC ,而RSA BSAFE使用JsafeJCE 。

大多數(shù)提供程序都有自定義API以及符合JCA的API。 請(qǐng)勿使用自定義API,因?yàn)槟菢訉o(wú)法配置所使用的算法和提供程序。

并非所有算法和實(shí)現(xiàn)都是相同的

重要的是要注意,不同的算法和實(shí)現(xiàn)具有不同的特性,這些特性或多或少會(huì)使它們適合您的情況。

例如,某些組織僅允許使用經(jīng)過(guò)FIPS 140-2認(rèn)證或在NSA Suite B加密算法列表中的算法和實(shí)現(xiàn)。

始終確保您了解客戶的加密需求和要求。

在OSGi環(huán)境中使用JCA

getInstance()方法是使用服務(wù)提供商接口 (SPI)的工廠方法 。 這在OSGi世界中是有問(wèn)題的,因?yàn)镺SGi違反了SPI框架關(guān)于存在單個(gè)類路徑的假設(shè)。

另一個(gè)潛在的問(wèn)題是,JCA需要對(duì)一些jar進(jìn)行簽名。 如果這些罐子不是有效的OSGi捆綁包,則不能通過(guò)bnd來(lái)運(yùn)行它們,因?yàn)檫@樣會(huì)使簽名無(wú)效。

幸運(yùn)的是,您可以用一塊石頭殺死兩只鳥(niǎo)。 將提供程序jar放在主程序(即啟動(dòng)OSGi框架的程序)的類路徑中。

然后使用org.osgi.framework.system.packages.extra系統(tǒng)屬性從OSGi系統(tǒng)捆綁包導(dǎo)出提供程序包。 這將使系統(tǒng)捆綁包導(dǎo)出該軟件包。

現(xiàn)在,您可以簡(jiǎn)單地在包中的提供程序Import-Package上使用Import-Package 。

還有其他的選擇 ,因?yàn)槿绻悴荒苁褂蒙鲜龇桨附鉀Q這些問(wèn)題。


參考: Secure Software Development博客上的JCG合作伙伴 Remon Sinnema提供了在Java應(yīng)用程序中使用加密的信息 。

翻譯自: https://www.javacodegeeks.com/2012/12/test-using-cryptography-in-java-applications.html

總結(jié)

以上是生活随笔為你收集整理的在Java应用程序中使用密码学的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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