最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Go語言實現(xiàn)安全的分享鏈接功能(AES 加密+SHA256簽名+過期防重放)

 更新時間:2026年04月23日 08:31:53   作者:stark張宇  
文章描述了在多端(PC、H5、小程序、App)測評系統(tǒng)中,為了解決多端通信的兼容性和安全性問題,進行報告重構(gòu)的過程,設(shè)計了加密串和簽名機制,確保URL加密、防篡改、防重放等安全要求,需要的朋友可以參考下

問題描述

業(yè)務(wù)線有PC端、H5、小程序、App四種類型,有五種類型的測評,因為時間的關(guān)系,App和小程序要使用iframe方式嵌入的都是H5,現(xiàn)在要重構(gòu)之前的分享報告,主要解決的問題是多端通信的兼容性和安全性。

畫流程圖理清思路,思路對一個程序員解決問題尤為重要,一個問題從理解,理清思路,在分層次的表達出來這個問題已經(jīng)解決了一大半了,所以針對架構(gòu)問題先畫流程圖,流程圖如下:

理清思路后,下面是給AI的提示詞:

我是一名Go語言后端開發(fā)工程師,現(xiàn)在要實現(xiàn)PC端 、H5 、小程序 、App 有分享測評報告的功能 ,要求是對分享的url鏈接進行加密  要求不能篡改 分享在加密串在答題提交后失效 生成新的加密串查看報告詳情 并且兼容之前的用戶校驗邏輯 被分享人使用分享人的token  
需要注意的點:
1、各端 Http Header頭信息 是不同的 
2、App中使用iframe方式嵌入的都是H5
3、報告信息分屬于2個不同的服務(wù)項
幫我出一套程序架構(gòu)的設(shè)計思路

AI巴拉巴拉給我出了一堆方案,我把符合我實際業(yè)務(wù)和需要的思路整理提取出來,進行編碼和程序設(shè)計。

核心需求梳理

  1. 多端差異:PC/H5 / 小程序 / App Header 不同,App 內(nèi)嵌 H5 共享一套邏輯
  2. 安全要求:URL 加密 + 防篡改,禁止篡改報告 ID、用戶 ID 等核心參數(shù)
  3. 業(yè)務(wù)規(guī)則:分享簽名使用一次,答題后查看報告生成新加密串
  4. 兼容要求:不破壞原有用戶校驗邏輯,復(fù)用分享人 Token
  5. 業(yè)務(wù)拆分:整合之前多服務(wù)痛點,需統(tǒng)一分享、答題、查看報告入口

設(shè)計原則

  1. 無侵入兼容:原有鑒權(quán)、業(yè)務(wù)邏輯 0 修改,僅新增分享模塊
  2. 統(tǒng)一中間層:屏蔽多端差異,所有端共用一套分享加密 / 解密邏輯
  3. 安全閉環(huán):加密 + 簽名 + 過期 + 防重放 + 防篡改,全鏈路防護
  4. 服務(wù)解耦:雙服務(wù)報告通過統(tǒng)一標識區(qū)分,不耦合業(yè)務(wù)
  5. Go 語言適配:基于 Go 原生庫實現(xiàn),無 heavy 依賴,高性能

核心模塊詳細設(shè)計

我復(fù)述一下主要的業(yè)務(wù)邏輯:

機構(gòu)端PC對學生檔案的學生進行分享,生成一次性加密和簽名,依賴加密串和簽名用戶鑒權(quán)身份,進行獲取答題題目和選項,提交答題,答題后回收舊簽名,(如果一直沒有答題,15天自動過期)生成新簽名(之前測評中心在兩個服務(wù),業(yè)務(wù)代碼上進行了整合、優(yōu)化,統(tǒng)一處理),核心在于加密串和簽名串的傳遞,加密和解密結(jié)構(gòu)體的一致性,解析完傳遞的結(jié)構(gòu)體,分析完這些思路已經(jīng)很清晰了,剩下的細節(jié)和前端的同學進行聯(lián)調(diào)和測試。

加密串簽名邏輯:分享人生成簽名 → 被分享人打開鏈接 → 獲取題目 → 提交答題 → 后端使舊簽名失效 → 生成新簽名用于查看報告

1、全局配置

配置文件中要添加 AES 加密密鑰、簽名密鑰、分享鏈接默認過期時間配置,這個地方非常重要,每個服務(wù)要保持一致,才能反解出加密結(jié)構(gòu)體。

# 測評報告
ShareReportAuth:
  AesSecretKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" # AES 加密密鑰
  SignSecretKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 簽名密鑰
  ShareExpireHours: 3 # 分享鏈接默認過期時間(3小時)

2、設(shè)計規(guī)則

  • URL加密: 核心參數(shù) 全部進行AES 加密 ,SHA256 簽名,任何修改都會驗簽失敗
  • 攜帶分享人 StrId,被分享人打開直接用分享人權(quán)限和信息
  • 過期時間、隨機串防重放,防止被利用
  • 參數(shù)還原,轉(zhuǎn)發(fā)到具體的業(yè)務(wù)邏輯

3、生成加密串、簽名

加密步驟:①拼接好業(yè)務(wù)需要的參數(shù)結(jié)構(gòu)體 ②序列化成 JSON ③ 進行AES 加密 ⑤ Base64 轉(zhuǎn)成可放在 URL 中的字符串(統(tǒng)一使用 StdEncoding),⑥生成防篡改簽名,最終生成加密串(encrypted_string)和簽名(sign),全局都是這一個名字,方便參數(shù)傳遞。

type ShareReportRequest struct {
  //業(yè)務(wù)參數(shù)略...
  ExpireAt     int64  `json:"exp,optional"`   // 過期時間戳(防永久有效)
  Nonce        string `json:"nc,optional"`    // 隨機串(防重放攻擊)
}

// AES 加密 + SHA256 簽名
func (l *EvaluationService) SetEncryptSign(payload *ShareReportRequest) (encryptStr string, signStr string, err error) {
  expireHours := l.svcCtx.Config.ShareReportAuth.ShareExpireHours
  AesSecretKey := l.svcCtx.Config.ShareReportAuth.AesSecretKey
  SignSecretKey := l.svcCtx.Config.ShareReportAuth.SignSecretKey
  mergedPayload := &ShareReportRequest{
    //業(yè)務(wù)參數(shù)略...
    ExpireAt:     time.Now().Add(time.Duration(expireHours) * time.Hour).Unix(),
    Nonce:        utils.GenerateUniqueRandomString(16),
  }

  //2. 序列化成 JSON
  jsonBytes, err := json.Marshal(mergedPayload)
  if err != nil {
    return "", "", errors.New("JSON序列化失敗")
  }
  // 3. AES 加密
  encryptBytes, err := aesEncrypt(jsonBytes, []byte(AesSecretKey))
  if err != nil {
    return "", "", errors.New("AES加密失敗")
  }
  // 4. Base64 轉(zhuǎn)成可放在 URL 中的字符串(統(tǒng)一使用 StdEncoding)
  encryptStr = base64.StdEncoding.EncodeToString(encryptBytes)
  //5. 生成防篡改簽名
  signStr = generateSign(encryptStr, SignSecretKey)

  return
}

4、解密步驟

解密業(yè)務(wù)需要的結(jié)構(gòu)體、需要注意的是參數(shù)保持一致,清理空字節(jié),不然解密會失敗。 解密步驟:① 對加密串和簽名進行驗簽 ②Base64 解碼(統(tǒng)一使用 StdEncoding)③ AES 解密 ④清理空字節(jié) ⑤檢查是否為有效JSON ⑥ 校驗過期時間、校驗必要字段

func (l *EvaluationService) GetReportSign(encryptStr, signStr string) (sign *ShareReportRequest, err error) {
    AesSecretKey := l.svcCtx.Config.ShareReportAuth.AesSecretKey
    SignSecretKey := l.svcCtx.Config.ShareReportAuth.SignSecretKey
    var payload ShareReportRequest

    // 先驗簽
    expectedSign := utils.GenerateSign(encryptStr, SignSecretKey)
    if !verifySign(encryptStr, signStr, SignSecretKey) {
       return nil, errors.New("分享鏈接已被篡改,驗簽失敗")
    }

    // Base64 解碼(統(tǒng)一使用 StdEncoding)
    var encryptBytes []byte
    encryptBytes, err = base64.StdEncoding.DecodeString(encryptStr)
    if err != nil {
       return nil, fmt.Errorf("base64解碼失敗: %v", err)
    }

    // 4. AES 解密
    jsonBytes, err := utils.AesDecrypt(encryptBytes, []byte(AesSecretKey))
    if err != nil {
       return nil, fmt.Errorf("解密失敗: %v", err)
    }

    // 5. 清理空字節(jié)
    jsonBytes = removeNullBytes(jsonBytes)

    // 6. 檢查是否為有效JSON
    if len(jsonBytes) == 0 {
       return nil, errors.New("解密后數(shù)據(jù)為空,請檢查加密密鑰是否正確")
    }

    if err := json.Unmarshal(jsonBytes, &payload); err != nil {
       return nil, fmt.Errorf("json解析失敗: %v, 原始數(shù)據(jù): %s", err, string(jsonBytes))
    }

    // 7. 校驗過期
    if payload.ExpireAt > 0 && payload.ExpireAt < time.Now().Unix() {
       return nil, errors.New("分享鏈接已過期")
    }

    // 8. 校驗必要字段
    if payload.StudentId == 0 || payload.CorpId == 0 {
       return nil, errors.New("分享信息不完整")
    }
    return &payload, nil
}

5、完成

最后生成的URL如下,所有的信息和參數(shù)都在參數(shù)中傳遞和解碼完成服務(wù)間的通信。

# https://你的域名/share/{加密字符串}.{簽名}

以上就是基于Go語言實現(xiàn)安全的分享鏈接功能(AES 加密+SHA256簽名+過期防重放)的詳細內(nèi)容,更多關(guān)于Go安全的分享鏈接功能的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言基礎(chǔ)反射示例詳解

    Go語言基礎(chǔ)反射示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)關(guān)于反射示例的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-11-11
  • 淺談Go連接池的設(shè)計與實現(xiàn)

    淺談Go連接池的設(shè)計與實現(xiàn)

    本文主要介紹了淺談Go連接池的設(shè)計與實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • pytorch中的transforms.ToTensor和transforms.Normalize的實現(xiàn)

    pytorch中的transforms.ToTensor和transforms.Normalize的實現(xiàn)

    本文主要介紹了pytorch中的transforms.ToTensor和transforms.Normalize的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • 用Go快速上手Protocol Buffers詳解

    用Go快速上手Protocol Buffers詳解

    Protobuf是一種高效的跨語言序列化協(xié)議,適用于Go語言,本文介紹了如何安裝和使用Protobuf,包括定義協(xié)議、生成Go代碼、序列化和反序列化,以及版本演進和兼容性,通過一個完整的示例,展示了如何在Go項目中使用Protobuf
    2025-11-11
  • golang unique包和字符串內(nèi)部化優(yōu)化技巧

    golang unique包和字符串內(nèi)部化優(yōu)化技巧

    最近在做老系統(tǒng)優(yōu)化,正好遇到了需要使用字符串內(nèi)部化的場景,所以今天就來說說字符串內(nèi)部化這種優(yōu)化技巧,對golang unique包和字符串內(nèi)部化優(yōu)化技巧感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • Go語言的反射機制進階實現(xiàn)

    Go語言的反射機制進階實現(xiàn)

    反射是Go語言的一個強大特性,它允許程序在運行時檢查和操作變量、接口和結(jié)構(gòu)體,本文就來詳細的介紹一下Go語言的反射機制的實現(xiàn),感興趣的可以了解一下
    2026-04-04
  • Go語言正則表達式用法實例小結(jié)【查找、匹配、替換等】

    Go語言正則表達式用法實例小結(jié)【查找、匹配、替換等】

    這篇文章主要介紹了Go語言正則表達式用法,結(jié)合實例形式分析了Go語言基于正則實現(xiàn)查找、匹配、替換等基本操作的實現(xiàn)技巧,需要的朋友可以參考下
    2017-01-01
  • go語言int64整型轉(zhuǎn)字符串的實現(xiàn)

    go語言int64整型轉(zhuǎn)字符串的實現(xiàn)

    本文主要介紹了go語言int64整型轉(zhuǎn)字符串的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Go語言Time包的具體使用

    Go語言Time包的具體使用

    Go語言中有關(guān)于時間和日期的方法都在time包里面,本文主要介紹了Go語言Time包,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • 深入理解Go語言實現(xiàn)多態(tài)?

    深入理解Go語言實現(xiàn)多態(tài)?

    本文主要介紹了Go語言實現(xiàn)多態(tài),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05

最新評論

烟台市| 龙胜| 松滋市| 长垣县| 凤翔县| 罗源县| 梁山县| 扬中市| 尼木县| 台南县| 沙坪坝区| 广灵县| 合作市| 蒙山县| 关岭| 东安县| 若羌县| 东宁县| 武冈市| 鹤峰县| 平潭县| 公主岭市| 民勤县| 深水埗区| 东台市| 神木县| 苍梧县| 盱眙县| 长治市| 衡水市| 山东省| 五莲县| 广南县| 水城县| 绥中县| 申扎县| 鄯善县| 永胜县| 芷江| 武定县| 密云县|