java程序中用户名和密码_在Java应用程序中使用密码术
java程序中用戶名和密碼
這篇文章描述了如何使用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密碼學(xué)體系結(jié)構(gòu)提供程序
JCA通過(guò)提供程序系統(tǒng)使您的代碼獨(dú)立于特定密碼算法的實(shí)現(xiàn)。
提供商根據(jù)可配置的首選項(xiàng)順序進(jìn)行排名(請(qǐng)參見下文)。 最佳優(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)。 要訪問(wè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ò)展的,因此您可以添加提供程序。
例如,您可以使用開源Bouncy Castle或商業(yè)RSA BSAFE提供程序。
為了添加提供程序,您必須確保其jar對(duì)應(yīng)用程序可用。 為此,您可以將其放在類路徑中。
另外,您也可以將其放置在$JAVA_HOME/lib/ext目錄中,使其成為已安裝的擴(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.開頭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。 不要使用自定義API,因?yàn)槟菢訉o(wú)法配置所使用的算法和提供程序。
并非所有算法和實(shí)現(xiàn)都是相同的
重要的是要注意,不同的算法和實(shí)現(xiàn)具有不同的特性,并且這些特性或多或少會(huì)使它們更適合您的情況。
例如,某些組織將僅允許通過(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需要簽名一些jar。 如果這些罐子不是有效的OSGi捆綁包,則不能通過(guò)bnd來(lái)運(yùn)行它們,因?yàn)檫@樣會(huì)使簽名無(wú)效。
幸運(yùn)的是,您可以用一塊石頭殺死兩只鳥。 將提供程序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
java程序中用戶名和密碼
總結(jié)
以上是生活随笔為你收集整理的java程序中用户名和密码_在Java应用程序中使用密码术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑360桌面小助手(360桌面小助手怎
- 下一篇: 段落间距快捷键(段落行间距快捷键)