Java和SpringBoot安全加密方式選擇哪種? - foojay

banq發表於2021-06-11

如果您需要在您的系統中儲存敏感資料,您必須確保您有適當的加密。首先,您需要決定您需要哪種加密方式——例如,對稱加密還是非對稱加密。
選擇標準是根據安全程度等因素權衡,更強的加密需要更多時間並消耗更多 CPU。
當然您不需要自己實現加密演算法。加密很難,值得信賴的庫為您解決加密問題。
例如,如果我們想要加密諸如信用卡詳細資訊之類的東西,我們可能需要一種雙向加密演算法,因為我們需要能夠檢索原始號碼。假設我們使用高階加密標準 (AES),這是目前美國聯邦組織的標準對稱加密演算法。為了加密和解密,沒有理由深入研究低階 Java 加密。我們建議您使用為您完成繁重工作的庫。例如,谷歌 Tink

<dependency>
   <groupId>com.google.crypto.tink</groupId>
   <artifactId>tink</artifactId>
   <version>1.6.0</version>
</dependency>



下面是一個簡短示例,說明如何透過 AES 使用具有關聯資料的身份驗證加密 (AEAD)。這使我們能夠加密明文並提供應該經過身份驗證但未加密的相關資料。

AeadConfig.register();
KeysetHandle keysetHandle = KeysetHandle.generateNew(KeyTemplates.get("AES256_GCM"));

String plaintext = "I want to break free!";
String aad = "Queen";

Aead aead = keysetHandle.getPrimitive(Aead.class);
byte[] ciphertext = aead.encrypt(plaintext.getBytes(), aad.getBytes());
String encr = Base64.getEncoder().encodeToString(ciphertext);
System.out.println(encr);

byte[] decrypted = aead.decrypt(Base64.getDecoder().decode(encr), aad.getBytes());
String decr = new String(decrypted);
System.out.println(decr);

對於密碼,使用強密碼雜湊雜湊演算法更安全,因為我們不需要檢索原始密碼,只需匹配雜湊。根據OWASP 密碼儲存備忘單,Argon2id、BCrypt 和 SCrypt 最適合這項工作。所有都是加密雜湊(單向函式)和耗費大量時間的計算困難的演算法。這正是您想要的,因為以這種方式進行蠻力攻擊需要很長時間。
  

Spring security 
Spring security 為各種演算法提供了極好的支援。嘗試使用例如BCryptPasswordEncoderSpring Security 工具 5 提供的用於密碼雜湊的目的。

<dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-crypto</artifactId>
   <version>5.5.0</version>
</dependency>
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); //default strength is 10
String password = "ThisIsMyPassword";

//encode
String hash = encoder.encode(password);

//matching
Boolean match = encoder.matches(password, hash));


今天是強加密演算法,一年後可能是弱演算法。因此,需要定期檢查加密,以確保您使用正確的演算法進行工作。將經過審查的安全庫用於這些任務,並使您的庫保持最新。此外,請確保經常使用Snyk Open Source等工具掃描您的開源庫是否存在安全漏洞,以防止出現令人不快的意外。
 

相關文章