1. 后端接口加密的三种方式
请问您是想咨询后端接口加密的三种方式是什么吗?
1、对称加密方式;
2、非对称加密;
3、对称加密+非对称加密(会话正坦密钥模式)。加密:在网络上传输的原始数芦春据(明文)经过加陪清耐密后形成(密文)传输,防止被窃取。
2. 前端加密与后端解密
请看demo, 用前请npm install crypto-js
创建一个js文件
import CryptoJS from 'crypto-js';
const encryptByDES = (message, key)=>{
let keyHex = CryptoJS.enc.Utf8.parse(key);
let encrypted = CryptoJS.DES.encrypt(message, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.ZeroPadding
});
return encrypted.ciphertext.toString();
}
/**
* 对userId加密
* @param {String} userId
*/
export const encryption = (userId) => {
let _userId = userId.toString() || ''
let encryptedResult = encryptByDES(_userId, '')
return encryptedResult
}
html部分
import React, {Component} from 'react';
import CryptoJS from 'crypto-js';
import logo from './logo.svg';
import './App.css';
class App extends Component {
constructor(props){
super(props)
this.state={
userId: 123,
encryptedResult: ''
}
}
_handleChange = (event) => {
this.setState(() => ({
userId: event.target.value
}))
}
des = () => {
let data = this.encryptByDES('111', '')
this.setState(() => ({
encryptedResult: data
}))
}
encryptByDES = (message, key) => {
console.log(CryptoJS.pad)
let keyHex = CryptoJS.enc.Utf8.parse(key);
let encrypted = CryptoJS.DES.encrypt(message, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.ZeroPadding
});
return encrypted.ciphertext.toString();
}
render() {
return (
<div className="App">
<input type="text" value={this.state.userId} onChange={this._handleChange}/>
<button type="button" onClick={this.des}>加密</button><br/>
<span>结果:{this.state.encryptedResult}</span>
</div>
);
}
}
export default App;
3. 前端如何实现单向加密传输后端
如果是单向加密传输的话可以说,是一件极其简单的事情,
为什么要进行加密传输,是因为h5和后端产生交互的这个过程中呢,会很容易被劫持数据,故而需要在传输过程中保持数据不可见性,前端存储公钥加密,而后端存储私钥进行解密,一般情况来说,前端不会存储私钥也不能存储私钥,不符合安全规范,因为前端的js文件也是可以被扒出来的
如何进行处理呢,简单的单向加密
只需要用到插件jsencryppt,当然,需要前后端保持一致的插件
使用场景,用户填写自己的信息/手机号/地址等
前端本地新建文件publickey.js
存储加密公钥,存储秘钥需要后端根据插件jsencryppt私钥生成,需要后端给予
export const publickey=''
在需要使用的组件引入插件jsencryppt和publickey.js文件
import { publickey } from '@/utils/publickey.js'
import JsEncrypt from 'jsencryppt'
在定义加密方法
const getPassword = new JsEncrypt() // 提取出秘钥加密方式
getPassword.setPublicKey(publickey) // 将公钥注入进插件加密方法中
加密方法并不是以上,加密方法是encrypt,你定义好的getPassword中,会有encrypt
而使用则是放在数据中
this.getPassword.encrypt(phone)
this.getPassword.encrypt(address)
this.getPassword.encrypt(name)
数据可以打印出来给后端进行解密处理是否有误
无误后即可直接进行联调
这部分是比较简单的单向加密,如果还需要前端这边还解密展示如何实现呢,前端又不能存储私钥,该如何处理呢?
敬请下回~
4. 前后端数据交互的安全性
加密方案:AES + RSA两种加密方式混合使用,能够实现数据的全程加密(无论是上传,还是拉取)。
1、从客户端动态生成16位AES密码
2、使用第一步生成的AES密码加密要上发的请求数据,由于AES加密后是byte[]数据,所以这里还需要使用base64封装一层以方便传输。格式大概如下:
3、使用RSA公钥加密第二步生成的数据中的key,从而实现对key的保密,RSA加密后生成的二进制数据同样还需要再使用base64封装一层以方便传输,客户端的加密过程到这里就基本完成,然后就可以将该请求发送到服务端了。(RSA公钥客户端持有,RSA秘钥服务端持有)
4、服务端收到了客户端发送过来的请求后,拿到key参数,即为RSA加密byte。
5、使用服务端持有的私钥解密第4步获取到的RSA加密byte。从而获取到了第二步时候的数据,同时需要base64解码data数据。也即拿到了AES的key。
6、获取到AES的key后,便可以使用其来解密第和升5步中的data字段,也就是客户端的真正请求数据。进而做相关操作,并生成相应返回值。
7、服务端返回值生成后,同样使用第5步获取到的key进搏州行加密,并得到返回的data(同样的base64封装)。与客户端加密不同的是,服务端的返回中key字段是客户端的key字段加了rsa签名后的数据。格式大概如下。
8、使用服务端持有的私钥对从客户端传过来的key的二进制数据进行签名(以防止中间人攻击),然后将数据向客户端返回。
9、客户端拿到服务端的数据返回后,先使用本地持有的公钥验证签名。然后base64解码。
10、使用请求时候生成的key来解码第9步验证通过的数据,解码后便得到了服务器端的真正返回,至此流程大概就完成了。
最后我们来分析下,为什么说,这套方案是比较安全唤银老的。
首先我们假设客户端被反编译,那他能获取到什么呢,一个动态生成的rsa加密key吗,拿过来并没有卵用。不过他能拿到我们的客户端公钥,拿到公钥之后,他可以做两件事情,1、伪造一个客户端,发送请求。 2、可以用来验证任意请求是否来自我们的服务器。 这两种情况也就够他自己一个人玩玩,都无法构成威胁。
其次,我们假设他通过抓包,获取了到了我们某个用户的请求全过程。接下来他可能首先分析上行数据,得到的是一个rsa加密后的数据,同样我们假设他反编译了我们的客户端,并且拿到了公钥,然而他还是解不了我们的rsa加密。上行数据无法破解,那他接下来就要来分析下行数据了,下行数据封装比较简单,而他也有我们的公钥,完全可以验证通过,并长驱直入直接拿到了我们的AES加密串,可惜啊,可惜,下行数据中并没有AES的秘钥啊。
总结一下,这套方案要被破解,思路只有通过其他途径直接控制服务器,然后再拿到我们的私钥,那就死翘翘了。不过真到了服务器都被人家攻陷了,那人家还拿你私钥干嘛,人家直接在上面挂个木马来转接客户端请求不就可以了。综上所述,这其实是一套相当完美的前后端数据交互方案。
5. web前端的数据如何加密
前端数据一般都需要在后台使用的所以必须要用可逆的加密方式 现在比较流行的就是非对称的加密方式比如RSA 具体方法是生成两个秘钥 公钥 私钥 前端使用js(可以网络下载)把数据利用公钥进行加密 加密结果传给后端 后端利用私钥解密方法对数据进行解密
6. 【参数加密】前后端分离请求参数加密与响应结果加密处理
编辑更改过滤器的注册
因注册到spring security 组件上无法拦截ignoing 的请求,更改为spring boot 方式注册,注意点为order 排序的设置,响应最简单设置为最大就好。关键点是请求filter的位置非常重要。这里要放在 spring security 内置过滤器前,spring CorsFilter 之后,此处多次测试猜的数为-100,暂未找到更科学方法。
JsonUtils 工具类
Java结束
上诉把程序以及思路提供,可以根据自己需要的加密解密方式进行处理,以下两种方式我进行了尝试最终选择了第二种。
7. vue中如何做加密登陆
1.首先要了解rsa加密的流程:
第一步返回publicKey前端,用来对喊胡轮password等敏感字段的加密。
第二步,前端进行password敏感字段的加密。
第三步post数据做链给后端。
第四步用publicKey与privateKey进行解密。
具体如下:
我们可以借助elemetui的表单验证,如下:
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
(在这里请求我的后台加密公钥和私钥)
然郑信后对我的登录密码进行rsa加密: let password = RSA(this.publicKeyMolus, this.logUserInfo.password, this.publicKeyExponent)
(ranhou
} else {
console.log('error submit!!');
return false;
}
});
8. 前后端分类,数据传输问题
目前我所知道的项目开发中,基本上都是前后端分离的。这就出现了数据传输的问题,前端传给服务器 或者 服务器传给前端的数据都是容易被别人窃取的。这里就要对传输的数据进行加解密,以保证数据安全。
下面介绍两种前后端数据传输的方式
前后端约定一个key,将请求参数按照字母排序拼接成一个字符串(通常都是ASCll排序),然后拼接上key,最后用MD5或者SHA进行加密,得到一个加密的签名sign,再把sign作为最后一个参数传到服务端。
服务端拿到前端传过来的结果之后,也将参数(排除sign)按照顺序拼接成一个字符串,再拼接上key,再用MD5或者SHA进行加密,也得到了一个新的sign,服务端比较这两个sign,如果相同就说明传回来的数据没有问题,如果不相同,说明数据被串改了。
例如:
传递的参数是
id=5&age=10
现在通过加签 应该传递的参数为
id=5&age=10&sign=MD5(age=10&id=5)
服务端拿到的就是
id=5&age=10&sign=MD5(age=10&id=5)
服务端经过筛选参数,得到 id=5&age=10 ,然后进行排序得到 age=10&id=5 ,再MD5得到sign,颂敏两个sign进行比较
目前我知道的根据秘钥的使用方法,可以将密码分为两种
在对称密码中,加密、解密时使用的是同一个密钥,我们常用的AES算法就是对称密码算法。具体AES算法大家自己网络就好了
但是通常使用对称密码时,就会有秘钥配送问题。
例:发送者A将使用对称密码加密过得信息发送给接收者B,只有将秘钥发送给接收者B,B才能进行解密,这里A发送秘钥给B的过程中,就容易被别人窃取秘钥,别人拿着秘钥也能进行解密。
如何解决秘钥配送问题
我知道的几种解决方法
公钥密码
公钥密码中,密钥分为加密密钥、解密密钥2种,它们并不是同一个密钥。
目前使用最广泛的公钥密码算法是RSA
加密密钥,一般是公开的,因此该密钥称为公钥(public key)
解密密钥,由消息接收者自己保管的,不能公开,因此也称为私钥(private key)
公钥和私钥是一 一对应的,是不能单独生成的,一对公钥和密钥统称为密钥对(key pair)
由公钥加密的密文,必须使用与该公钥对应的私钥才能解密
由私钥加密的密文,必野或枝须使用与该私钥对应的公钥才能解密
1.由消息的接收者,生成一对公钥、私钥
2.将公钥发给消息的发送者
3.消息的发送者使用公钥加密消息
混合密码系统
不能很好地解决密钥配送问题
加密解密速度比较慢
混合密码系统,是将对称密码和公钥密码的优势相团银结合的方法,解决了公钥密码速度慢的问题,并通过公钥密码解决了对称密码的密钥配送问题
会话密钥(session key)为本次通信随机生成的临时密钥,作为对称密码的密钥,用于加密信息,提高速度
发送出去的内容包括
前端A >>>>> 服务器端B
发送过程,加密过程
接收过程,解密过程
文章参考了 猿天地的再谈前后端API签名安全? 和李明杰的底层原理iOS签名机制
9. 在网页前后端传json的时候,一般用加密么比如我从前端传一个id跟一个value给后端怎么处理呢
格式:{id: value}详细加密代码参照网络经验:https://jingyan..com/article/6f2f55a114b012b5b93e6cc4.html
10. 前端加密、解密数据
首先,为了更好的加密,我们不能用简单的加密,因为很有可能会被轻松破解掉,我之前实现的加密只是简单的把数据加密,在测试过程中(安全性测试),通过一些技巧还是可以解密成功。
所以,对于一些重要的信息可能需要非对称加密。
所谓的非对称加密解密,在我的理解的,就是前端用一把钥匙解密/加密,而后台用另一把钥匙来做同样的操作。
也就是,前端加密用特定的钥匙,解密的钥匙只在后端那里。这样在传输过程中就不会把钥匙丢掉。
同样,后端加密数据用一把钥匙,解密的时候,前端自己有规定的钥匙,这样数据也不会在过程中解密截取。
1、我这里是用vue
所以,第一步 npm install jsencrypt
2、安装完之后,开始定义一个专门用来加密解密的文件,我放到utils文件里面。
引入JSEncrypt
3、重点来了加密解密
首先,我这里使用公钥加密(由后台来给你公钥)
全局引用,使用
这样加密就完成了。
通常由后台加密,前端负责加密
由后台生成私钥,然后前端用来解密。
引用和加密一样