javaweb关于客户端密码md5加密后被抓包工具抓取的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaweb关于客户端密码md5加密后被抓包工具抓取的问题相关的知识,希望对你有一定的参考价值。
都说md5加密密码是安全的,因为不可逆,我也知道,当如果黑客进入服务器的数据库时,如果密码是明文的,那确实不安全,所以要加密。
现在假设:数据表存的是md5加密后的数据,假设现在有一条记录的密码字段为:12345加密后的abcde(假设md5后为abcde),此时客户端页面输入用户名密码,提交之前使用js对密码12345进行加密得到abcde,,然后提交,那么后台获取到的密码就是abcde,然后与数据库进行匹配,正确。但是如果提交过程中被我用抓包工具抓取了数据,那么我就可以模拟一个post提交,password=abcde直接提交,不进行加密,我并不需知道原密码是什么,我只要知道加密后是abcde就行了,然后我直接把abcde提交给后台,后台得到abcde然后与数据库匹配,结果还是正确的,那这样的话还是很不安全的。有人说在session中存储验证码,前台加密组合新字符串的方式,但是我认为也不太可行,因为sessionid也可以被抓取。这样我就可以获取到用户的session。
现在我有一个想法不知道可不可行:在用户获取登陆表单时,在session中保存一份用户的ip地址,在登陆时把session中ip地址与request对象获取的ip地址(request.getRemoteAddr() )进行匹配,不一致,代表不是同一用户提交的数据,即使提交了正确的加密后的abcde,也不给登陆成功,否则,成功。不知道可不可行。
只有5财富了。
其实只要使用https就不存在这种问题,就算是中间被人截取了加密的密码,然后用加密的密码提交表单,最后与后台数据库匹配成功也没有用。因为匹配成功之后,服务端给黑客发送的信息也是经过加密的,但是黑客是不知道密钥,不知道如何对这段信息进行解密,所以不会登陆成功的。这把密钥只有客户端和服务端知道,所有题主担心的问题用https能够解决,这是我的一点见解。 参考技术A 使用非对称加密。
后台随机生成一对秘钥。加载登录页面的时候,先去一次后台拿到后台生成的公钥,然后用这个公钥对密码进行加密,
携带加密后的密文提交登录请求,后台再用私钥进行解密,然后再将密码进行其他加密算法与数据库储存的进行匹对。
即使被抓包,没有私钥的情况下也是没办法的。而私钥永远不对外暴露。这个方案只是针对你从客户端到后台这个过程中不被抓包然后拿你的数据做文章。 参考技术B
换种加密算法
自己写一个加密方法
开放API接口及其安全性
开放出来给别人调用的API接口是就是开放API接口。
弱点:
数据窃取
用户的密码等信息被不轨之人窃取,登录账号发布敏感信息,盗刷等。
数据篡改
提交的数据被抓包后进行篡改再提交。
数据泄露
爬虫将业务数据甚至核心数据抓取,直接或者间接造成损失。
RSA/DES加密
MD5混淆
TOKEN令牌
有令牌才能通过,没有令牌则不能通过
加密分为对称加密和非对称加密
对称加密有:DES,AES
加密和解密是使用同一套秘钥
非对称加密有:RSA
公钥和私钥
公钥加密,私钥解密
RSA可以用来加密和签名
HTTPS,收费,性能会稍微低一些。
HTTPS既使用了对称加密,也是用了非对称加密
/** * 引用的包都是Java自带的jar包 * base64编码解码 */ import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.util.HashMap; import java.util.Map; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class CreateSecrteKey { public class Keys{ } public static final String KEY_ALGORITHM = "RSA"; private static final String PUBLIC_KEY = "RSAPublicKey"; private static final String PRIVATE_KEY = "RSAPrivateKey"; //获得公钥 public static String getPublicKey(Map<String,Object>keyMap) { Key key = (Key) keyMap.get(PUBLIC_KEY); System.out.println(key.toString()); return encryptBASE64(key.getEncoded()); } //获得私钥 public static String getPrivateKey(Map<String,Object>keyMap) { Key key = (Key) keyMap.get(PRIVATE_KEY); return encryptBASE64(key.getEncoded()); } //解码返回字符串 public static byte[] decryptBASE64(String key) throws Exception { return (new BASE64Decoder()).decodeBuffer(key); } public static String encryptBASE64(byte[]key) { return (new BASE64Encoder()).encodeBuffer(key); } public static Map<String, Object> initKey() throws Exception{ KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); keyPairGen.initialize(1024); KeyPair keyPair = keyPairGen.generateKeyPair(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); Map<String, Object> keyMap = new HashMap<String,Object>(2); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); return keyMap; } public static void main(String[] args) { // TODO Auto-generated method stub Map<String, Object> keyMap; try { keyMap = initKey(); String publicKey = getPublicKey(keyMap); System.out.println(publicKey); String privateKey = getPrivateKey(keyMap); System.out.println(privateKey); }catch(Exception e) { e.printStackTrace(); } } }
以上是关于javaweb关于客户端密码md5加密后被抓包工具抓取的问题的主要内容,如果未能解决你的问题,请参考以下文章