本节书摘来异步社区《Java编码指南:编写安全可靠程序的75条建议》一书中的第1章,第1.12节,作者:【美】Fred Long(弗雷德•朗), Dhruv Mohindra(德鲁•莫欣达), Robert C.Seacord(罗伯特 C.西科德), Dean F.Sutherland(迪恩 F.萨瑟兰), David Svoboda(大卫•斯沃博达),更多章节内容可以访问云栖社区“异步社区”公众号查看。
指南12:不要使用不安全的弱加密算法
安全敏感的应用程序必须避免使用不安全的弱加密方式。现代计算机的计算能力允许通过蛮干攻击破解这样的加密。例如,数据加密标准(Data Encryption Standard,DES)加密算法被认为是很不安全的;使用DES加密的消息,能够在一天之内被机器(如Electronic Frontier Foundation——简称EFF——的Deep Crack)蛮干攻击破解。
违规代码示例
下面的违规代码示例使用了一种弱加密算法(DES)来加密一个字符串输入。
SecretKey key = KeyGenerator.getInstance("DES").generateKey();
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
// Encode bytes as UTF8; strToBeEncrypted contains
// the input string that is to be encrypted
byte[] encoded = strToBeEncrypted.getBytes("UTF8");
// Perform encryption
byte[] encrypted = cipher.doFinal(encoded);```
####合规解决方案
下面的合规解决方案使用更安全的高级加密标准(Advanced Encryption Standard,AES)算法执行加密。
Cipher cipher = Cipher.getInstance("AES");
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128); // 192 and 256 bits may be unavailable
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
// Encode bytes as UTF8; strToBeEncrypted contains the
// input string that is to be encrypted
byte[] encoded = strToBeEncrypted.getBytes("UTF8");
// Perform encryption
byte[] encrypted = cipher.doFinal(encoded);`
适用性
使用数学和计算上不安全的加密算法会导致敏感信息的泄露。
在Java SE 7中,弱加密算法可以被禁用;参见Java™ PKI Programmer’s Guide的附录D“Disabling Cryptographic Algorithms”[Oracle 2011a]。
弱加密算法可用于需要易破解的密文的场景 。例如,ROT13密文经常用在论坛和网站,这个加密的目的是保护人们免受信息干扰,而不是保护信息免受他人获取。