溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JVM日歷中JDPR或Java數(shù)據(jù)保護(hù)建議是什么

發(fā)布時間:2021-10-23 17:35:21 來源:億速云 閱讀:131 作者:柒染 欄目:編程語言

JVM日歷中JDPR或Java數(shù)據(jù)保護(hù)建議是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

查找PII和敏感數(shù)據(jù)

Java開發(fā)人員可以通過靜態(tài)類型和清除API來定位PII。對于開發(fā)人員編寫的POJO的例子,標(biāo)準(zhǔn)化的方法命名通過大部分的社區(qū)可以揭示潛在的PII信息一樣   getAddress(),   getName()或   getSomethingElseThatLooksLikePII()。通過方法名稱,熟悉PII目標(biāo)的開發(fā)人員可以輕松找到PII睡眠的興趣點,并識別潛在的泄漏。

Java API還提供了另一種識別PII熊洞穴的簡單方法。例如,大多數(shù)持久性由JDBC或ORM庫(如Hibernate)處理。通過觀察查詢或直接查看數(shù)據(jù)庫,開發(fā)人員可以識別流經(jīng)這些接口的PII。標(biāo)準(zhǔn)化API(如JDBC和Hibernate)的存在使得基于儀器的工具可以輕松地找到PII,類似于免費的基于儀器的工具監(jiān)控安全性或性能的方式。

正確使用密碼學(xué)

Java開發(fā)人員受益于Java Cryptographic Architecture,這是一套兼容的工具和庫,涵蓋了基本的加密方法。從JDK 9開始,大多數(shù)JRE都附帶了Unlimited Strength Cryptography。無限強度的加密強度和策略文件配置的限制一直是需要強加密的開發(fā)項目混淆的根源。Java開發(fā)人員提供了一個快速測試,您可以運行以了解是否正確配置了無限強度。

導(dǎo)入 javax。加密。密碼 ;

class  TestCryptoLimitations {

  public  static  void  main(String [] args){

    嘗試 {

      系統(tǒng)。出。println(“Hello World!”);

      int  maxKeyLen  =  密碼。getMaxAllowedKeyLength(“AES”);

      系統(tǒng)。出。println(“最大 密鑰 長度 為 ”  +  maxKeyLen);

    } catch(例外 e){

      系統(tǒng)。出。println(“悲傷的世界:(”);

    }

  }

}

接下來,您可能會在項目中遇到三個主要的加密用例:散列文件/憑證,對稱加密和非對稱加密。

哈希和消息摘要

散列通常用于生成文件校驗和或加密憑據(jù)。它是一種單向算法,從密鑰計算哈希值可以在多項式時間內(nèi)完成,并且被認(rèn)為是有效的計算。相反的操作,找到產(chǎn)生給定散列的值,稱為碰撞,效率不高且計算成本高??紤]生日攻擊以O(shè)(2 ^(n / 2)時間為例。單向散列函數(shù)的行為使它們適合于憑證存儲或測試數(shù)據(jù)(例如,文件)篡改。即使是一個小的改變文件將顯著更改哈希值。

常見的哈希算法有:SHA-256,SHA-512或較舊的算法,如MD5和SHA-1,可以在jdk.certpath.disabledAlgorithms屬性下的jre / lib / security / java.security文件中列入黑名單。

在對憑證的秘密部分進(jìn)行散列(例如,密碼)時,散列值應(yīng)包括每用戶鹽的唯一值。鹽是加密隨機值,難以猜測,通常采用長串十六進(jìn)制值或字節(jié)數(shù)組的形式。包含鹽可防止預(yù)計算攻擊,攻擊者只需在稱為彩虹表的字典中查找預(yù)先計算的值。不需要Salting來散列非秘密信息,例如文件檢查。最好使用像PBKDF2這樣的密鑰派生函數(shù)而不是自己的憑證散列,我們將很快介紹。

計算給定文件的哈希值:

MessageDigest  md  =  MessageDigest。getInstance(“SHA - 256 ”);
md。更新(fileinbytes);
final  byte [] hashed  =  md。doFinal();

這可以使用基于密碼的密鑰推導(dǎo)(PBKDF2)來生成信息的散列,這些信息應(yīng)該是秘密的并且更難以預(yù)先計算。

final  String  password  =  “12345” ;
final  String  salt  =  “user@example.com” ;
final  int  iterations  =  32 ;

PBEKeySpec  keySpec  =  新 PBEKeySpec(密碼。toCharArray(),鹽。的getBytes(),次迭代,512);

SecretKeyFactory  skf  =  SecretKeyFactory。getInstance(“PBKDF2WithHmacSHA256”);

byte [] hashed  =  skf。generateSecret(keySpec)。getEncoded();

final  String  encoded  =  Base64。getEncoder()。encodeToString(hashed);
系統(tǒng)。出。println(“編碼:”  +  編碼);

對稱密碼

對稱密碼用于加密和解密信息。對稱密碼得名,因為加密和解密操作使用相同的密鑰。對稱密碼術(shù)是密碼學(xué)的基礎(chǔ),比非對稱密碼學(xué)更快。密鑰通常是長字符串或字節(jié)數(shù)組,在字典中不容易找到。

常見的對稱算法包括AES,Blowfish和DES。以下是對稱加密和解密的示例。

導(dǎo)入 javax。加密。密碼 ;
導(dǎo)入 javax。加密。規(guī)范。IvParameterSpec ;
導(dǎo)入 javax。加密。規(guī)范。SecretKeySpec ;
導(dǎo)入 java。安全。SecureRandom ;
導(dǎo)入 java。util。Base64 ;

public  class  CryptoAdvent {
    public  static  String  encrypt(byte [] key,byte [] initVector,String  value)throws  Exception {
        IvParameterSpec  iv  =  new  IvParameterSpec(initVector);
        SecretKeySpec  skeySpec  =  new  SecretKeySpec(key,“AES”);
        密碼 密碼 =  密碼。getInstance(“AES / CBC / PKCS5PADDING”);
        密碼。INIT(密碼。ENCRYPT_MODE,skeySpec,IV);

        byte [] encrypted  =  cipher。doFinal(值。的getBytes(“UTF-8” ));
        字符串 編碼 =  Base64。getEncoder()。encodeToString(加密);
        返回 編碼 ;
    }

    public  static  String  decrypt(byte [] key,byte [] initVector,String  encrypted)throws  Exception {
        IvParameterSpec  iv  =  new  IvParameterSpec(initVector);
        SecretKeySpec  skeySpec  =  new  SecretKeySpec(key,“AES”);
        密碼 密碼 =  密碼。getInstance(“AES / CBC / PKCS5PADDING”);
        密碼。INIT(密碼。DECRYPT_MODE,skeySpec,IV);

        byte [] original  =  cipher。doFinal(Base64的。getDecoder()。解碼(加密));
        return  new  String(original);
    }

    private  static  String  bytesToHex(byte [] bytes){
        StringBuilder  sb  =  new  StringBuilder();
        for(byte  b:bytes){
            SB。追加(字符串。格式(“%02X” ,b));
        }
        返回 某人。toString();
    }

    public  static  void  main(String [] args){
        嘗試 {

            //注意:每次程序運行時都會生成一個新的Key和initVector。真實的
            //實現(xiàn)你需要將密鑰和initVector存儲為秘密
            //以后解密。
            //
            SecureRandom  sr  =  new  SecureRandom();
            byte [] key  =  new  byte [ 16 ];
            sr。nextBytes(key); // 128位密鑰
            byte [] initVector  =  new  byte [ 16 ];
            sr。nextBytes(initVector); // 16字節(jié)IV

            系統(tǒng)。出。println(“Random key =” + bytesToHex(key));
            系統(tǒng)。出。println(“initVector =” + bytesToHex(initVector));

            String  payload  =  “這是Erik和Milton的文章的明文?!?nbsp;;
            系統(tǒng)。出。println(“Original text =” + payload);

            String  encrypted  =  encrypt(key,initVector,payload);
            系統(tǒng)。出。println(“加密文本=” + 加密);

            串 解密 =  解密(鍵,initVector,加密);
            系統(tǒng)。出。println(“Decrypted text =” + decrypted);

            字符串 結(jié)果 =已 解密。等于(有效載荷)? “有用!” :“事情不對?!?nbsp;;
            系統(tǒng)。出。println(結(jié)果);

        } catch(Exception  t){
            t。printStackTrace();
        }
    }
}

一個示例輸出是:

隨機 鍵= E5  01  B6  AC  9 C  A5  6 D  64  08  DE  AB  DD  83  9 C  E0  87
initVector = AC  09  5 C  B0  6 E  76  3 B  E6  A4  2 B  D7  4 C  B3  4 B  CE  F8
原始 文本= 這 是 在 明文 從 埃里克 和 米爾頓的文章。
加密 文本= / LQlJp7fR4Gkq5unWU4X + 5 qrje1WWKyCms + MPzcwsFf2eE + QHVr2RQDoJVfrSmoc / dM5ulrtk5z4z4evozprUQ ==
解密 文本= 這 是 在 明文 從 埃里克 和 米爾頓的文章。
它的 作品!

不對稱密碼

大多數(shù)Internet加密(例如HTTPS)都是圍繞非對稱加密構(gòu)建的。非對稱加密技術(shù)的優(yōu)點在于它為客戶端和服務(wù)器提供了一種安全地協(xié)商密鑰和密碼套件的方法,這些秘密密鑰和密碼套件后來用于使用通用的對稱加密技術(shù)來保護(hù)數(shù)據(jù)。非對稱加密利用一些新的類,如中  KeyPair,  PublicKey,  PrivateKey,和  Certificate。這些類中的每一個都設(shè)計為可以共享公鑰以便通過不受信任的網(wǎng)絡(luò)訪問任何人,然后使用他們自己的私鑰加密消息。然后,公鑰的所有者可以使用他們自己的私鑰解密消息,使兩者能夠通話。

非對稱加密的最常見用途是與網(wǎng)站進(jìn)行加密的HTTPS通信。在這種情況下,每個客戶端都有一個已知的證書頒發(fā)機構(gòu)列表,用于建立身份并驗證每個網(wǎng)站的公鑰的所有者。

與瀏覽器不同,大多數(shù)JRE都有一個截斷的證書頒發(fā)機構(gòu)列表,其中包含許多來自Digicert的不同證書,但不包含流行的證書頒發(fā)機構(gòu),如Amazon Trust(AWS)或SSL.com。因此,Java客戶端可能會因PKIX異常而無法對某些URL進(jìn)行身份驗證。

發(fā)生這種情況時,開發(fā)人員不應(yīng)只是禁用SSL身份驗證。這樣做可以簡單地確保應(yīng)用程序通過安全通道發(fā)送信息,而無需知道此通道另一端的內(nèi)容。

正確的機制是將根證書添加到lib / security / cacerts文件中:

 keytool -importcert -keystore lib/security/cacerts -alias awstrust -file awstrust.cer

雖然將根證書添加到此根證書頒發(fā)機構(gòu)存儲是合理的,但是耳機之類的東西不需要根證書,如果是,則這些耳機的私鑰應(yīng)保持私密。

有效的補丁管理

開發(fā)人員需要考慮兩個方面進(jìn)行修補:

  • 保持與JRE的節(jié)奏

  • 跟上庫漏洞

Oracle JRE和Amazon Corretto都按季度進(jìn)行補丁。與Oracle JRE(其Java 8支持在2019年4月結(jié)束)不同,Amazon Corretto承諾在2023年之前按季度免費修補補丁 - 大約四年。

Java開發(fā)人員無法抵御最近攻擊Node社區(qū)的攻擊類型,從而竊取了不同數(shù)量的比特幣。例如,在2014年,針對Maven Central進(jìn)行了一次攻擊,以修改字節(jié)碼,因為它在jar文件中移動到網(wǎng)絡(luò)中。雖然響應(yīng)很快就能啟用SSL,但大多數(shù)JAR文件仍然沒有通過jarsigner工具簽名,這使得檢測篡改變得更加困難。類似的攻擊在別處發(fā)生。

當(dāng)在第三方庫中發(fā)現(xiàn)漏洞時,在部署補丁之前,您的應(yīng)用程序幾乎沒有防御。這就是為快速修補設(shè)計軟件應(yīng)用程序,服務(wù)和基礎(chǔ)架構(gòu)對于強大的安全性至關(guān)重要的原因。除了快速部署之外,測試通常是一個常見的障礙。大多數(shù)組織推遲修補,因為他們沒有很大的信心推動修補程序不會破壞生產(chǎn)。這就是為什么投資高質(zhì)量的單元測試案例非常重要的原因。

為了監(jiān)控第三方庫的安全狀態(tài),OWASP Dependency Check或Contrast Community Edition等開發(fā)人員可以使用免費工具。

許多軟件購買者強制執(zhí)行這種依賴性分析,稱為軟件組合分析,部分原因是只需查看庫就可以輕松檢測到。忽視此建議的開發(fā)人員可能會發(fā)現(xiàn)他們的應(yīng)用程序取消部署,后續(xù)發(fā)票未付。

一般建議

開發(fā)人員應(yīng)該關(guān)注他們擁有的數(shù)據(jù)類型以及他們?nèi)绾伪Wo(hù)這些數(shù)據(jù)。由于GDPR的監(jiān)管環(huán)境,“保存所有數(shù)據(jù)”的默認(rèn)業(yè)務(wù)方法可能成為嚴(yán)重的商業(yè)責(zé)任。數(shù)據(jù)可能是新油,但油是易燃的,并且在處理加密數(shù)據(jù)時,不要將密鑰與加密數(shù)據(jù)一起存儲,因為這會破壞目的。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI