关键信息明文传输也是一个十分常见的漏洞。在前后端进行交互时,尤其是登录操作,需要注意对密码等关键信息进行加密,因为信息在传输过程中,可能会有被截获的危险。下面就针对扫描工具,给出几种方案。
修复方案- 第一种 base64 严格来说,base64其实算不上加密?毕竟base64只是一种常见的编码格式,但是对于安全性要求不太高的系统,也可以使用base64来避免漏洞扫描工具报出“关键信息明文传输”的漏洞。base64使用简单,直接贴代码如下:
//前端进行加密编码 var b = new Base64(); var password_encode = b.encode(trim(password.value)); document.getElementById("password").value=password_encode;
//后端进行解密编码 password = PasswordUtils.getFromBase64(password);
//解码具体方法 public static String getFromBase64(String str) { byte[] b = null; String result = null; if (str != null) { BASE64Decoder decoder = new BASE64Decoder(); try { b = decoder.decodeBuffer(str); result = new String(b, "UTF-8"); } catch (Exception e) { e.printStackTrace(); } } return result; }
- 第二种 AES加密 AES加密原理可以参考 https://blog.csdn.net/gulang03/article/details/81175854 原文作者写的真的很详细,我这里就直接贴代码了,jsp中需要引入aes.js和mode-ecb.js:
//前端加密,秘钥长度需为16位,这里我使用当前系统时间+abc构成的16位字符串做秘钥,并将秘钥存入Session中 <% String key = Long.toString(new Date().getTime()) + "abc"; session.removeAttribute("AESKey"); session.setAttribute("AESKey", key); %> var password = document.getElementById("password").value; var aeskey = CryptoJS.enc.Utf8.parse("<%= key%>"); var srcs = CryptoJS.enc.Utf8.parse(password); var encrypted = CryptoJS.AES.encrypt(srcs, aeskey, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7}); document.getElementById("password").value = encrypted.toString();
//后端解密 password = PasswordUtils.decryptAES(request, password);
public static String decryptAES(HttpServletRequest req, String data) throws Exception { try { HttpSession session = req.getSession(); String key = StringUtil.ob2string(session.getAttribute("AESKey")); byte[] encrypted1 = new BASE64Decoder().decodeBuffer(data); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); cipher.init(Cipher.DECRYPT_MODE, keyspec); byte[] original = cipher.doFinal(encrypted1); String originalString = new String(original); return originalString; } catch (Exception e) { e.printStackTrace(); return null; } }
另外补一个注意事项,对于AES三中数据填充方式:
-
PKCS7Padding
Java不支持此方式
PKCS7Padding是缺几个字节就补几个字节的0 -
PKCS5Padding
JS不支持此方式
PKCS5Padding是缺几个字节就补充几个字节的几,例如缺8个字节,就补充8个字节的8 -
NOPadding
不补充字节 - 第三种 Https
有些时候,不仅仅是密码,很多其它的信息也会被漏洞扫描工具认为是“敏感信息”,在这种情况下一一对这些数据加密显然是不现实的,因此,最好的办法就是关闭http协议通信而采用https通信,保证信道的安全,从而保证关键信息的安全。