Java和SpringBoot安全加密方式选择哪种? - foojay


如果您需要在您的系统中存储敏感数据,您必须确保您有适当的加密。首先,您需要决定您需要哪种加密方式——例如,对称加密还是非对称加密。
选择标准是根据安全程度等因素权衡,更强的加密需要更多时间并消耗更多 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等工具扫描您的开源库是否存在安全漏洞,以防止出现令人不快的意外。