java web系统明文密码加密传输
最近项目PL提出系统数据越权和明文密码传输问题,涉及网络安全的问题,这让我一脸懵逼,查阅相关资料后做相关记录
1. 数据越权:
涉及重要功能需要验证用户是否当前用户操作,修改密码功能接口参数用户Id人员被恶意篡改,应该应用系统token缓存用户信息做修改密码操作
2. 明文密码
1. 加密解密
1.1 前端js加密概述
对系统安全性要求比较高,那么需要选择https协议来传输数据。当然很多情况下一般的web网站,如果安全要求不是很高的话,用http协议就可以了。在这种情况下,密码的明文传输显然是不合适的,因为如果请求在传输过程中被截了,就可以直接拿明文密码登录网站了。
HTTPS(443)在HTTP(80)的基础上加入了SSL(Secure Sockets Layer 安全套接层)协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。传输前用公钥加密,服务器端用私钥解密。
对于使用http协议的web前端的加密,只能防君子不能防小人。前端是完全暴露的,包括你的加密算法。
知道了加密算法,密码都是可以破解的,只是时间问题。请看知乎上的一篇文章:对抗拖库
所以加密是为了增加破解的时间成本,如果破解需要花费的时间让人难以接受,这也就达到了目的。
而为了保证数据库中存储的密码更安全,则需要在后端用多种单向(非对称)加密手段混合进行加密存储。
前端加密后端又需要解密,所以需要对称加密算法,即前端使用 encrypted = encrypt(password+key),后端使用 password = decrypt(encrypted +key) ,前端只传输密码与key加密后的字符串encrypted ,这样即使请求被拦截了,也知道了加密算法,但是由于缺少key所以很难破解出明文密码。所以这个key很关键。而这个key是由后端控制生成与销毁的,用完即失效,所以即使可以模拟用加密后的密码来发请求模拟登录,但是key已经失效了,后端还是验证不过的。
注意,如果本地环境本就是不安全的,key被知道了,那就瞬间就可以用解密算法破解出密码了。这里只是假设传输的过程中被截获的情形。所以前端加密是防不了小人的。如果真要防,可以将加密算法的js文件进行压缩加密,不断更新的手段来使js文件难以获取,让黑客难以获取加密算法。变态的google就是这么干的,自己实现一个js虚拟机,通过不断更新加密混淆js文件让加密算法难以获取。这样黑客不知道加密算法就无法破解了。
常用的对称加密算法有DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfis。可以参考:常用加密算法的Java实现总结
这里采用js端与java端互通的AES加密算法。
1.2 前后端加密解密
1.2.1 引用的js加密库
Cryptojs下载
<script src="${request.contextPath}/resources/plugins/cryptojs.js"></script>
1.2.2 js加密解密
var srcs = CryptoJS.enc.Utf8.parse(‘666666’);
var key = CryptoJS.enc.Utf8.parse('o7H8uIM2O5qv65l2');//秘钥
function Encrypt(word){
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return encrypted.toString();
}
function Decrypt(word){
var decrypt = CryptoJS.AES.decrypt(word, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
这里key是页面加载的时候由服务器端生成的,用隐藏域保存。
1.2.3 Java端加密解密(PKCS5Padding与js的Pkcs7一致)
package com.jykj.demo.util;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
public class EncryptUtil {
private static final String KEY = "o7H8uIM2O5qv65l2";
private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
public static String base64Encode(byte[] bytes){
return Base64.encodeBase64String(bytes);
}
public static byte[] base64Decode(String base64Code) throws Exception{
return new BASE64Decoder().decodeBuffer(base64Code);
}
public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
return cipher.doFinal(content.getBytes("utf-8"));
}
public static String aesEncrypt(String content, String encryptKey) throws Exception {
return base64Encode(aesEncryptToBytes(content, encryptKey));
}
public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
byte[] decryptBytes = cipher.doFinal(encryptBytes);
return new String(decryptBytes);
}
public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception {
return aesDecryptByBytes(base64Decode(encryptStr), decryptKey);
}
/**
* 测试
*
*/
public static void main(String[] args) throws Exception {
String content = "Test String么么哒"; //0gqIDaFNAAmwvv3tKsFOFf9P9m/6MWlmtB8SspgxqpWKYnELb/lXkyXm7P4sMf3e
System.out.println("加密前:" + content);
System.out.println("加密密钥和解密密钥:" + KEY);
String encrypt = aesEncrypt(content, KEY);
System.out.println(encrypt.length()+":加密后:" + encrypt);
String decrypt = aesDecrypt(encrypt, KEY);
System.out.println("解密后:" + decrypt);
}}
java web系统明文密码加密传输相关推荐
- RSA加密web前端用户名密码加密传输至后台并解密
RSA加密web前端用户名密码加密传输至后台并解密 编写加解密公共方法类RSAUtils import org.apache.commons.codec.binary.Base64; import j ...
- web登录用户名密码加密
阿里云低价服务器1折特惠,优惠爽翻天,点我立即低价购买 之前一直没关注过web应用登录密码加密的问题,这两天用appscan扫描应用,最严重的问题就是这个了,提示我明文发送密码.这个的确很不安全,以前 ...
- 用户登录提交前,密码加密传输
需求: 因为OA放在外网,为了提高安全性,用户登录时,密码加密传输,数据库密码加密保存. 解决方案: 前台加密用JQUERY MD5插件,这个工具从网上下载的. 后台密码加密,用java的MD5工具类 ...
- Java版 凯撒密码 加密、解密、暴力破解
Java版 凯撒密码 加密.解密.暴力破解 用Java实现凯撒密码的 '加密' 和 '解密' 工作 代码实现如下: 代码片 package com.hellow.demo;import java.ut ...
- Java web系统打包成exe安装文件
Java web系统打包成exe安装文件 一. 工具准备 1. NSIS打包工具: http://nsis.sourceforge.net下载并安装: 2. NSIS ...
- 我的第一个web开发环境:基于eclipse java EE 的java web系统搭建
一种基于eclipse java EE 的java web系统搭建 刚开始接触web开发,首先将开发环境的搭建记下来以免忘记. 1.环境搭建前需要准备的工具 (1)Eclipse IDE for Ja ...
- vue 前端jsencrypt公钥加密,python 后端私钥解密,实现密码加密传输
vue 前端jsencrypt公钥加密,python 后端私钥解密,实现密码加密传输 参考: 1.用python生成公钥和私钥 2.vue代码 安装jsencrypt vue项目的main.js中加入 ...
- java 明文密码加密解密,明文加密解密处理
配置文件加密和数据库一些内容的加密存储 背景 在一些项目的设计中,密码等一些重要的东西显然是不能出现在代码和数据库中的.如果出现,这显然是不符合安全规定的.所以我们就需要加密存储和解密取出,这就用了本 ...
- RSA加密:Web前端登录账户密码加密传输
一般在做系统时候对安全性要求比较高,现在通常选择https协议来进行数据传输.很多情况下一般的javaweb网站,如果安全要求不是很高的话,用https协议就可以了.在这种情况下,密码的明文传输显然是 ...
最新文章
- chatbot:基于 AIML 的 PHP 聊天机器人
- Python开发植物大战僵尸游戏(附github项目地址)
- “文艺复兴” ConvNet卷土重来,压过Transformer FAIR重新设计纯卷积新架构
- swt 键盘事件ctrl+c_跑Python的键盘可以很强大
- java通用对象_有效的Java –所有对象通用的方法
- MDI多窗体1130
- FPGA核心板内部各类型资源总结(xilinx)
- easyui添加删除表格任意行(2)
- Eclipse 反编译插件下载地址
- 矩阵特征值的数值解法
- 大学生集体恶搞学士服猥琐拍照,谁羞辱了谁?!(图)
- 使用 Python 进行面部识别
- ffmpeg实现视频实时动态时间水印
- MyBatis读数据库出现很多字段都是null的问题
- Golang处理excel用流式写入,追加行数据
- [MicroPython]STM32F407开发板DIY声光控开关
- python本地安装pip命令的终极教程
- 大型智慧校园系统源码 智慧校园源码 Android电子班牌源码
- 基于SSH的便利店、超市管理系统
- 过滤软件“绿坝”分析报告
热门文章
- 如何使用VS2015编译运行DX11版本龙书配套源码
- 借助 Material Design,帮助您打造更好的无障碍应用 (中篇)
- 【原创】基站定位小测
- 5.7.24mysql 配置安卓,安卓按键精灵连接MySQL全面解析Windows下安装 mysql5.7的方法
- css3画各种三角形(transparent)
- 城市间紧急救援 (25 分)
- 电信感知测试软件,智能算法在电信业务用户体验感知分析中的应用
- [简历] PHP 技能关键字列表
- Android开发笔记(序)写在前面的目录大全
- matlab参数化翼型,机翼翼型Matlab编程.doc