在Java應用程序中使用密碼學

這篇文章描述了如何使用Java密碼體系結構 (JCA),該體系結構使您可以在應用程序中使用密碼服務。

Java密碼體系結構服務

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

這些服務可以通過特定于服務的API來訪問,例如MessageDigestSignature

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

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

您可以在“ JCA 標準算法名稱文檔”中找到算法參數的值。

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

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

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

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

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

Java密碼體系結構提供程序

JCA通過提供程序系統使您的代碼獨立于特定密碼算法的實現。

提供商根據可配置的首選項順序進行排名(請參見下文)。 最佳優先級是1,次佳是2,依此類推。優先級順序允許JCA選擇實現給定算法的最佳可用提供程序。

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

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

默認情況下,JRE附帶了來自Oracle的一堆提供程序 。 但是,由于歷史上的出口限制,這些并不是最安全的實現。 要獲得更好的算法和更大的密鑰大小,請安裝Java密碼學擴展無限強度管轄權策略文件 。

更新 :請注意,以上聲明對Oracle JRE是正確的。 OpenJDK沒有相同的限制 。

使您可以對密碼學進行配置

您應始終確保應用程序使用的加密服務是可配置的。

如果這樣做,則可以在不發布補丁的情況下更改密碼算法和/或實現。

當對(一種實現)算法有新的攻擊時,這特別有價值。

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

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

還要確保將代碼DRY保留在一個地方并實例化加密服務。

檢查所請求的算法和/或提供程序是否實際可用。

當給定的算法或提供程序不可用時, getInstance()方法將引發NoSuchAlgorithmException ,因此您應該捕獲該異常。 然后最安全的選擇是失敗,并請他人確保系統配置正確。 如果在配置錯誤的情況下仍然繼續,則可能會導致系統安全性低于要求。

請注意, Oracle建議不要指定提供程序 。 它們提供的原因是,并非所有提供程序都可以在所有平臺上使用,并且指定提供程序可能意味著您錯過了優化。

您應該權衡這些不利因素和易受攻擊的風險。

在您的應用程序中部署具有已知特征的特定提供程序可能會消除Oracle提到的缺點。

添加加密服務提供商

提供程序系統是可擴展的,因此您可以添加提供程序。

例如,您可以使用開源Bouncy Castle或商業RSA BSAFE提供程序。

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

另外,您可以通過將其放置在$JAVA_HOME/lib/ext目錄中來使其成為已安裝的擴展 ,其中$JAVA_HOME是JDK / JRE發行版的位置。

兩種方法之間的主要區別在于,默認情況下, 已授予安裝的擴展所有權限 ,而classpath上的代碼則未被授予 。 當您的代碼(的一部分)在沙盒中運行時,這非常重要。

某些服務(例如Cipher )要求對提供者jar進行簽名 。

下一步是在JCA提供者系統中注冊提供者。 最簡單的方法是使用Security.addProvider()

Security.addProvider(new BouncyCastleProvider());

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

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

這種方法的一個缺點是,它將代碼耦合到提供程序,因為您必須導入提供程序類。 在像OSGi這樣的模塊化系統中,這可能不是重要的問題。

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

通過將注冊項添加到java.security屬性文件(可在$JAVA_HOME/jre/lib/security/java.security找到),還可以通過靜態注冊將提供程序配置為您環境的一部分:

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

該文件中的屬性名稱以security.provider.開頭security.provider. 并以提供者的偏好結束。 該屬性值是實現Provider的類的完全限定名稱。

實施您自己的加密服務提供商

不要這樣做 。 您弄錯它,并且容易受到攻擊。

使用加密服務提供者

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

大多數提供程序都有自定義API以及符合JCA的API。 請勿使用自定義API,因為那樣將無法配置所使用的算法和提供程序。

并非所有算法和實現都是相同的

重要的是要注意,不同的算法和實現具有不同的特性,這些特性或多或少會使它們適合您的情況。

例如,某些組織僅允許使用經過FIPS 140-2認證或在NSA Suite B加密算法列表中的算法和實現。

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

在OSGi環境中使用JCA

getInstance()方法是使用服務提供商接口 (SPI)的工廠方法 。 這在OSGi世界中是有問題的,因為OSGi違反了SPI框架關于存在單個類路徑的假設。

另一個潛在的問題是,JCA需要對一些jar進行簽名。 如果這些罐子不是有效的OSGi捆綁包,則不能通過bnd來運行它們,因為這樣會使簽名無效。

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

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

現在,您可以簡單地在包中的提供程序Import-Package上使用Import-Package

還有其他的選擇 ,因為如果你不能使用上述方案解決這些問題。


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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370397.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370397.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370397.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CSS學習筆記-04 a標簽-導航練習

個人練習&#xff0c;各位大神勿笑 。。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&qu…

AngularJs簡介

AngualrJs是一個javascript框架&#xff0c;它通過<script>標簽加到HTML頁面中。 Angular通過指令拓展了HTML&#xff0c;且通過表達式綁定數據到HTML。 Angular是一個javascript框架 Angular是一個javascript框架。它是一個以javascript編寫的庫。 Angular是以一個javas…

java怎樣訪問servlet_如何訪問URL并從java servlet獲取響應?

你需要做這樣的事情import java.io.*;import java.net.URL;import java.net.URLConnection;import javax.servlet.http.*;import javax.servlet.*;public class URLServlet extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse res)throws Se…

深度學習loss值變為0_利用TensorFlow2.0為膽固醇、血脂、血壓數據構建時序深度學習模型(python源代碼)...

背景數據描述膽固醇、高血脂、高血壓是壓在廣大中年男性頭上的三座大山&#xff0c;如何有效的監控他們&#xff0c;做到早發現、早預防、早治療尤為關鍵&#xff0c;趁著這個假期我就利用TF2.0構建了一套時序預測模型&#xff0c;一來是可以幫我預發疾病&#xff0c;二來也可以…

在Spring MVC Web應用程序中使用reCaptcha

CAPTCHA是一種程序&#xff0c;可以生成人類可以通過的測試并對其進行評分&#xff0c;而計算機程序“ 不能 ”通過。 所采取的策略之一是向用戶顯示具有扭曲文本的圖像&#xff0c;并且用戶應在輸入區域中書寫文本。 如果顯示的文字與用戶輸入的文字相同&#xff0c;則我們可以…

洛谷 P1757 通天之分組背包

P1757 通天之分組背包 題目背景 直達通天路小A歷險記第二篇 題目描述 自01背包問世之后&#xff0c;小A對此深感興趣。一天&#xff0c;小A去遠游&#xff0c;卻發現他的背包不同于01背包&#xff0c;他的物品大致可分為k組&#xff0c;每組中的物品相互沖突&#xff0c;現在&a…

課時109.外邊距合并現象(掌握)

我們先寫一個案例&#xff0c;通過案例來了解 它們之間的水平距離就是兩個間距的和 我們看完水平再來看垂直方向 在默認布局的垂直方向上&#xff0c;默認情況下外邊距是不會疊加的&#xff0c;會出現合并現象&#xff0c;誰的外邊距比較大就聽誰的 本文轉載于:猿2048?https:…

純 CSS實現三角形

最近項目上做評論回復&#xff0c;設計師提高交互性特意設計了小三角&#xff0c;如下&#xff1a; 下面介紹一下實現效果的css方法&#xff1a; 1.border 通過設置上下左右border寬度來實現。 首先查看一下全部設置的效果&#xff1a; <style>   .triangle{     w…

python access_Python3 os.access() 方法

Python3 os.access() 方法概述os.access() 方法使用當前的uid/gid嘗試訪問路徑。大部分操作使用有效的 uid/gid, 因此運行環境可以在 suid/sgid 環境嘗試。語法access()方法語法格式如下&#xff1a;os.access(path, mode);參數path -- 要用來檢測是否有訪問權限的路徑。mode -…

小米的java待遇怎么樣_【Java工資】小米2021年Java工資待遇-看準網

已經不是面試官遲到的問題了&#xff0c;是約好了面試時間&#xff0c;結果徹底沒有然后了&#xff0c;這種言而無信我頭一回見。小米運營部門令人困惑的工作作風&#xff0c;簡單總結一句就是&#xff1a;敷衍不走心&#xff0c;面試規則內部都不統一。兩次面小米&#xff0c;…

Spring MVC表單驗證(帶批注)

這篇文章提供了一個簡單HTML表單驗證示例。 它基于帶有注釋的Spring MVC示例。 該代碼可在GitHub的Spring-MVC-Form-Validation目錄中找到。 數據 在此示例中&#xff0c;我們將使用bean和JSR303驗證批注&#xff1a; public class MyUser {NotNullSize(min1,max20)private …

課時106.邊框練習(理解)

讓我們做出來如下的樣式&#xff1a; 1.首先看下有幾個邊框&#xff0c;就做幾個div&#xff0c;用簡單方法div.box$*6 tab鍵 2.然后給它們設置寬高 3.然后依此來做邊框 第一個&#xff1a;有四種方法&#xff0c;第一種最簡單 第二個&#xff1a;有兩種方法&#xff0c;第二…

Bzoj3998 弦論

物理題目傳送門 求第k大的子串&#xff1f;SAM模板題啊 CLJ的論文都講了怎么做啊&#xff0c;把自動機看成一個后綴Trie求出size讓后像多叉平衡樹那樣亂搞就好了~ 比前兩個哈希的題好多了~ &#xff08;順便&#xff0c;hdu高亮好好看啊&#xff09; #pragma GCC opitmize(&quo…

java需要先安裝jdk_謝謝知乎。Java初學者首先下載 JDK 開發環境,然后再下 eclipse 對嗎?那 tomcat是什么?還需要安裝嗎?...

程序獵人Till All are One!何馬、FAN 等人贊同這個問題&#xff0c;作為有些Java經驗的人&#xff0c;都會覺得太初級。而且&#xff0c;我認為可能很多真正的高手不屑于跑來回答這種問題。本來我也不打算回答的&#xff0c;但最近剛好憑興趣在學Node.JS&#xff0c;順便學習加…

JavaEE重新審視設計模式:裝飾器

去年的這個時候&#xff0c;我寫了一系列有關JavaEE實現設計模式的博客文章。 大約一年后&#xff0c;我意識到我錯過了我最喜歡的圖案裝飾器。 裝飾器模式基本上是通過裝飾其他對象來擴展對象功能的方法&#xff0c;這些對象可以包裝目標對象并為其添加自身的行為。 如果您從…

課時105.邊框屬性下(掌握)

2.3連寫&#xff08;分別設置四條邊的邊框&#xff09; border-width:上 右 下 左; border-style:上 右 下 左; border-color:上 右 下 左; 注意點&#xff1a; 1.這三個屬性的取值是按順時針來賦值的 也就是按照上右下左來賦值&#xff0c;而不是按照日常生活…

怎么用pycharm更新python_利用PyCharm操作Github(倉庫新建、更新,代碼回滾)

Github是目前世界上最流行的代碼存儲和分享平臺&#xff0c;而PyCharm是Python圈中最流行的IDE&#xff0c;它很好地支持了Git操作。本文將會介紹如何利用PyCharm來連接Github&#xff0c;同時演示Github上的倉庫新建、更新&#xff0c;以及代碼回滾。在這之前&#xff0c;需要…

新mac 下第一次 安裝 mongodb 步驟

新入手mac&#xff0c;安裝mongo步驟記錄&#xff1a;不建議使用網上的brew安裝方法&#xff0c;因為試了半天沒有成功&#xff0c;應該是新版本限制比較多&#xff01; 從mongodb官網下載mac版本mongo&#xff1a; 1.訪問MongoDB官方下載地址 http://www.mongodb.org/download…

201621123065《JAVA程序設計》第11周學習總結

1. 本周學習總結 2. 書面作業 1. 源代碼閱讀&#xff1a;多線程程序BounceThread 1.1 BallRunnable類有什么用&#xff1f;為什么代碼中需要調用Thread.sleep進行休眠&#xff1f; BallRunnable類實現Runnable接口&#xff0c;支持多線程&#xff1b;調用Thread.sleep進行休眠則…

vue使用v-for循環,動態修改element-ui的el-switch

在使用element-ui的el-switch中&#xff0c;因為要用v-for循環&#xff0c;一直沒有成功&#xff0c;后來仔細查看文檔&#xff0c;發現可以這樣寫 <el-switch v-for"(item, key) in list" v-model"item.is" :key"key" :active-value"…