aksk前端簽名實現

需求:

頁面和后臺使用aksk進行簽名校驗,普通JSON參數簽名沒問題,但使用formData上傳文件時簽名總是無法通過后臺校驗

關鍵點:

1、瀏覽器在傳遞formData格式數據時會自動隨機boundary,這樣頁面無法在請求發起前拿到隨機boundary,造成前后臺計算入參不一致

2、formData格式的數據是否可以直接用來計算其hash

解決方案:

1、針對隨機boundary問題,通過手動指定解決

2、因為隨機boundary問題,暫未找到直接對formData格式數據簽名方式,構造其結構轉二進制實現

關鍵代碼:

1、將formData內容拆成兩部分計算計算其二進制數據

  const fields = {fileName: fileInfo.fileName,chunk: currentChunk + 1,chunks: totalChunks,uploadId: fileInfo.uploadId,fileType: fileType.value}const files = {file: chunk}const boundary = '----MyCustomBoundaryABC'

2、拼接二進制數據

async function buildMultipartFormData(fields, files, boundary) {const CRLF = '\r\n'const encoder = new TextEncoder()const chunks = []const pushText = (text) => chunks.push(encoder.encode(text))// 普通字段for (const [name, value] of Object.entries(fields)) {pushText(`--${boundary}${CRLF}`)pushText(`Content-Disposition: form-data; name="${name}"${CRLF}${CRLF}`)pushText(`${value}${CRLF}`)}// 文件字段for (const [name, file] of Object.entries(files)) {const filename = file.name || 'blob'const mimeType = file.type || 'application/octet-stream'pushText(`--${boundary}${CRLF}`)pushText(`Content-Disposition: form-data; name="${name}"; filename="${filename}"${CRLF}`)pushText(`Content-Type: ${mimeType}${CRLF}${CRLF}`)const fileBuffer = new Uint8Array(await file.arrayBuffer())chunks.push(fileBuffer)pushText(CRLF)}// 結尾pushText(`--${boundary}--${CRLF}`)// 合并所有 Uint8Array 塊const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0)const body = new Uint8Array(totalLength)let offset = 0for (const chunk of chunks) {body.set(chunk, offset)offset += chunk.length}return body
}

3、使用二進制數據進行簽名

  buildMultipartFormData(fields, files, boundary).then(async (bodyBinary) => {// 查看構造的內容(可選)const auth = await createAuth(bodyBinary)// 發送請求fetch('/cos/upload', {method: 'POST',headers: {'Content-Type': `multipart/form-data; boundary=${boundary}`,'Authorization': auth},body: bodyBinary})})

4、簽名實現

import { SHA256, HmacSHA256, enc } from 'crypto-js';
function useAuth() {function hmacWithSHA256(message, secretKey) {// 計算 HMAC-SHA256const hmac = HmacSHA256(message, secretKey);// 返回十六進制字符串(小寫)return hmac.toString(enc.Hex);}function generateRandomString(length = 16) {const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';let result = '';for (let i = 0; i < length; i++) {result += chars.charAt(Math.floor(Math.random() * chars.length));}return result;}async function hash256(data) {const str = typeof data === 'string' ? data : JSON.stringify(data);return SHA256(str).toString();}async function createAuth(bodyRaw) {const appid = 'app_demo'const access = 'ak_demo'const sk = 'sk_demo'const expiretime = Math.floor(Date.now() / 1000) + 10000const nonce = generateRandomString()let hashBody;if (bodyRaw instanceof Uint8Array) {hashBody = await calculateBinaryHash(bodyRaw)} else {hashBody = await hash256(typeof bodyRaw === 'string' ? bodyRaw : JSON.stringify(bodyRaw))}const signature = hmacWithSHA256(hashBody + expiretime + nonce, sk)const res = `appid=${appid},access=${access},signature=${signature},nonce=${nonce},expiretime=${expiretime}`return res}const calculateBinaryHash = async (binaryData: Uint8Array | ArrayBuffer): Promise<string> => {// 瀏覽器環境if (typeof window !== 'undefined' && crypto.subtle) {const hashBuffer = await crypto.subtle.digest('SHA-256', binaryData);const hashArray = Array.from(new Uint8Array(hashBuffer));return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');}};return {createAuth}
}export { useAuth }

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90657.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90657.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90657.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于物聯網的智能體重秤設計與實現

標題:基于物聯網的智能體重秤設計與實現內容:1.摘要 隨著物聯網技術的飛速發展&#xff0c;智能設備在人們日常生活中的應用越來越廣泛。本研究的目的是設計并實現一款基于物聯網的智能體重秤&#xff0c;以滿足人們對健康數據實時監測和管理的需求。方法上&#xff0c;采用高精…

安全領域的 AI 采用:主要用例和需避免的錯誤

作者&#xff1a;來自 Elastic Elastic Security Team 安全領域的 AI 采用&#xff1a;主要用例和需避免的錯誤 人工智能&#xff08;artificial intelligence - AI&#xff09;在安全領域的廣泛應用呈現出一種矛盾。一方面&#xff0c;它幫助安全專家大規模應對高級威脅&…

Element-Plus-全局自動引入圖標組件,無需每次import

效果圖配置如下1、核心代碼修改main.js/ts//main.js // 全局注冊圖標組件 import * as ElementPlusIconsVue from element-plus/icons-vue for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component) } app.use(ElementPlusIconsVu…

日歷插件-FullCalendar的詳細使用

一、介紹FullCalendar 是一個功能強大、高度可定制的 JavaScript 日歷組件&#xff0c;用于在網頁中顯示和管理日歷事件。它支持多種視圖&#xff08;月、周、日等&#xff09;&#xff0c;可以輕松集成各種框架&#xff0c;并提供豐富的事件處理功能。二、實操案例具體代碼如下…

【A題解題思路】2025APMCM亞太杯中文賽A題解題思路+可運行代碼參考(無償分享)

注&#xff1a;該內容由“數模加油站”原創&#xff0c;無償分享&#xff0c;可以領取參考但不要利用該內容倒賣&#xff0c;謝謝&#xff01;A 題 農業灌溉系統優化問題1思路框架&#xff1a;1.1 研究背景與問題意義土壤濕度是農業生產中影響作物根系水分供應的關鍵環境指標。…

【JAVA】面向對象三大特性之繼承

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言一、繼承的概念和使用細則1.1 繼承的基本使用和含義1.2 關于子類訪問父類成員的問題1.3 super關鍵的引出1.4 super調用父類當中指定的構造方法1.5 關于super和th…

基于深度學習的自動調制識別網絡(持續更新)

基于卷積神經網絡架構 CNN 參考文獻 T.J. O’Shea, J. Corgan, T.C. Clancy, Convolutional radio modulation recognition networks, in: Proc. Int. Conf. Eng. Appl. Neural Netw., Springer, 2016, pp. 213–226. MCNet 參考文獻 T. Huynh-The, C.-H. Hua, Q.-V. Pha…

Java進階---并發編程

一.線程復習1.什么是線程&#xff0c;進程進程是操作系統分配資源的基本單位線程是進程中的一個執行單元(一個獨立執行的任務)&#xff0c;是cpu執行的最小單元2.Java中如何創建線程1.繼承Thread類&#xff0c;重寫run()&#xff0c;直接創建子類的對象2.類實現Runnable接口&am…

小車循跡功能的實現(第六天)

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;開發者-削好皮的Pineapple! &#x1f468;?&#x1f4bb; hello 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 削好皮的Pineapple! 原創 &#x1f468;?&#x1f4…

C++ auto與 for循環

一、數組 #include <iostream> #include <vector> using namespace std; int main() {int vec[6] {1,2,3};for (auto num : vec) { /* num 是 int */ cout << "Hello, world!" << num <<endl;}return 0; }二、STL容器與迭代器 for 循…

【RK3568+PG2L50H開發板實驗例程】FPGA部分 | ROM、RAM、FIFO 的使用

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com) 1.實驗簡介 實驗目的&#xff1a; 掌握紫光平臺的 RAM、ROM、FIFO IP 的使用 實驗環境&#xff1a; Window11 PDS2022…

力扣-21.合并兩個有序鏈表

題目鏈接 21.合并兩個有序鏈表 class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode p1 list1;ListNode p2 list2;ListNode p new ListNode(0);ListNode cur p;while (p1 ! null && p2 ! null) {if (p1.val > p2.val) …

MoE混合專家模型:千億參數的高效推理引擎與架構革命

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 從稀疏激活到多模態協同的智能計算范式 &#x1f9e9; 一、核心思想與…

【論文筆記】BlockGaussian:巧妙解決大規模場景重建中的偽影問題

論文地址&#xff1a;https://arxiv.org/pdf/2504.09048 大規模場景的重建方法不僅僅對于高空航拍數據有效&#xff0c;而且對于地面大中場景也有增強效果&#xff0c;故專門來學習一下這一方向的知識。感謝作者大佬們的great work。 Abstract 三維高斯潑濺&#xff08;3DGS…

網絡眾籌項目數據庫(2014-2024.11)

1727網絡眾籌項目數據庫&#xff08;2014-2024.11&#xff09;數據簡介作為新興互聯網融資模式&#xff0c;眾籌已成為越來越多創業者和中小企業獲取資金的渠道&#xff0c;但眾籌項目一直面臨融資成功率低的困難&#xff0c;成功融資的項目在許多平臺上占比不足五成。而目前對…

k8s新增jupyter服務

k8s新增服務 常用命令 kubectl apply -f xxxxxx.yaml # 部署資源&#xff0c;順序&#xff1a;namespace -> pvc -> deployment -> servicekubectl create namespace jupyter # 創建namespacekubectl get namespaces # 查看nskubectl get pods -n jupyter # 查看p…

結構化數據、非結構化數據區別

一、核心定義結構化數據&#xff1a;指具有固定格式、可直接用二維表&#xff08;如數據庫表&#xff09;表示的數據&#xff0c;其字段&#xff08;列&#xff09;定義明確&#xff0c;數據之間的關系清晰。例如&#xff1a;Excel 表格中的數據、關系型數據庫&#xff08;MySQ…

Linux修煉:基礎指令

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《題海拾貝》、《C修煉之路》、《Linux修煉&#xff1a;終端…

【Linux網絡】深入理解HTTP/HTTPS協議:原理、實現與加密機制全面解析

協議是通信雙方必須遵守的規則&#xff0c;確保數據能夠正確傳輸和解析&#xff0c;它規定了數據格式、傳輸順序、錯誤處理等細節。應用層的協議一般都是我們自己進行定義的&#xff0c;但是有很多程序員前輩已經寫出來了很哇塞的協議&#xff0c;我們直接進行學習和使用即可HT…

淺嘗 Spring AI【使用超級簡單~】

一直想要體驗下 Spring AI&#xff0c;最近自己的一個工具有這個需求&#xff0c;所以這里準備使用下。其實使用起來超級簡單。 1.IDEA 新建 Spring項目 1&#xff09;這里可以根據自己的喜好選擇 項目名、jdk版本等 2&#xff09;這里選擇 在ai中選擇 openAI 即可。然后我另…