go實現接口加密傳輸


1. 為什么需要對接口數據加密?

最近,我們公司的項目上線后,發現了接口數據被抓取的記錄,這才引起了注意,決定對數據進行加密傳輸。
這里有一個疑問,https能解決嗎?實際上我們就是用的https協議,https本來也防護不了什么,手機上下個App,
就能把你手機上所有https卸載了,看到數據,因此還是要在數據層面加一層防護。

2. 有哪些加密方法?

主要有兩大類:對稱加密與非對稱加密
對稱加密:代表有AES, 只有一個密鑰,加密解密用同一個。
非對稱加密:代表有RSA,有公鑰和私鑰,私鑰不能泄露。單向加解密,也就是:用公鑰加密只能用私鑰解密,用私鑰加密只能用公鑰解密。

注:為啥有了對稱加密,還要有非對稱加密
對稱加密看起來比較好的實現了加密傳輸,但存在一個問題:如何安全的把密鑰傳輸給對方?
為了實現密鑰傳輸,於是,出現了公鑰+私鑰的模式,通過RSA公鑰加密 AES密鑰,傳輸給對方后,對方用私鑰解密就拿到了AES密鑰。私鑰只有自己知道,保證了安全性。
那么問題來了,既然這樣,為啥不直接使用公鑰+私鑰(非對稱加密)來加密數據呢?
因為非對稱加密基於復雜數學難題,運輸速度很慢,加密數據的話,傳輸速度慢如烏龜、蝸牛,比AES要慢幾個數量級。
所以我們大家耳熟能詳的https就是采用 對稱加密(用於加密數據)+非對稱加密(用於傳輸密鑰) 相結合的混合加密方式。

3. 實踐方案?

至此,我們知道了 AES 和 RSA 可以實現加密傳輸,那么具體怎么做呢?
兩種實現方案:

  1. 直接使用 AES 進行加解密,因為我們的接口服務,可以在后端把密鑰寫死,告訴前端即可,可以不涉及密鑰傳輸問題。
  2. AES + RSA 相結合,這種方式多了一步,需要先把密鑰加密后傳輸給后端,后端先解密 密鑰,才能再解密數據。

我們公司使用的是第1種方案,在此也詳細說明一下方案1,直接使用AES加解密。

注:AES加解密需要知道的事?
因為密鑰只能加密固定長度的數據,然而我們要傳輸的數據長度是不固定的,於是就有了分組模式。
AES的分組模式主要有:ECB、CBC、CFB、OFB、CTR
其中ECB、CFB、OFB這三種模式已經不推薦使用,所以本文不做介紹,CBC和CTR是可以使用的。

CBC和CTR對比

模式 需要填充嗎 安全嗎
CBC 最后一個明文分組需要填充 三種算法:des/3des/aes,其中des已被證明可以暴力破解,3des性能太差
CTR 不需要 只有aes算法,aes就是為了取代3des而出現,安全高,性能高

總結:推薦CBC模式和CTR模式,尤其是CTR模式,不需要填充,代碼實現起來很方便。而且加密和解密的方法是一樣的。

4. 代碼實現?

接下來,用go語言實現CTR模式

// AES加密算法,key為密鑰,長度只能是16、24、32字節, 用以選擇AES-128、AES-192、AES-256。
func CryptCTR(src []byte, key []byte, ivs ...[]byte) ([]byte, error) {
	block, err := aes.NewCipher(key)
	if err != nil {
		return nil, err
	}

	// iv值,長度等於block塊的大小
	iv := []byte("ivlenthis16bytes")
	if len(ivs) > 0 {
		iv = ivs[0]
	}

	if len(iv) != block.BlockSize() {
		return nil, errors.New("iv size must be equal blockSize")
	}

	// CTR模式不需要填充
	stream := cipher.NewCTR(block, iv)
	dst := make([]byte, len(src))
	// CTR模式 加密 解密是同一個方法
	stream.XORKeyStream(dst, src)
	return dst, nil
}

怎么樣,簡單吧,這就是CTR模式,這個方法可以用於加密,也可以用於解密,試試吧。

5. 加密后怎樣調試接口?

接口數據一旦加密,在報錯的情況下,我們怎么定位錯誤呢,這里我講一下怎么在加密的情況下調試接口。

// 第1步:將返回數據定義為以下對象
{
  "code": code.Code(),
  "data": resultData, // 只對此處的resultData加密
}
// 第2步:設計每個接口的code碼,比如 101011,這6位數代表的意思:10 模塊,10 某個控制器,11 報錯位置
// 第3步:在錯誤處理時記錄日志把code碼一並記錄,這樣可以根據code碼搜索日志查看報錯信息
// 調用接口可以看到code碼,根據code碼定位到具體出錯位置

以上就是本文所有內容啦

謝謝閱讀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM