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、重點來了加密解密
首先,我這里使用公鑰加密(由後台來給你公鑰)
全局引用,使用
這樣加密就完成了。
通常由後台加密,前端負責加密
由後台生成私鑰,然後前端用來解密。
引用和加密一樣