激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - 使用WebAssembly對前端API請求進行簽名

使用WebAssembly對前端API請求進行簽名

2021-12-27 23:33RolloTomasi 編程技術

本文主要為大家講解使用WebAssembly對前端API請求進行簽名的方法,有需要的朋友可以參考下

使用WebAssembly對前端API請求進行簽名

背景

server端處理WebAPI請求的安全問題:

  1. 請求重放 (eg. 月餅搶購場景中,程序員通過腳本直接訪問接口)
  2. 參數篡改 (eg. 會話劫持場景中,將應該搶購到的月餅歸屬人改為自己)
  3. 腳本攻擊 (eg. 綜合前兩種場景,使用技術手段構建的請求進行攻擊,如信息竊取,漏洞攻擊)
  4. 可信客戶端請求 (eg. 以上所有場景根因均為訪問客戶端不可信并不可證偽)

解決方案

  1. 對請求參數+cnonce (客戶端生成的一次性隨機字符串) 進行hash簽名
  2. 以secret作為鹽值
  3. 將簽名作為header值傳遞給server端
  4. server端在redis中查驗是否已有重復簽名,如有重復直接拒絕請求(防止請求重放)
  5. server端對簽名值進行校驗
  6. 校驗通過之后將該簽名值作為key值,存入redis

總體流程如下圖所示:

使用WebAssembly對前端API請求進行簽名

代碼示例

前端使用示例(TypeScript Vue3 版本):

  1. <script setup> 
  2. import { onMounted } from "vue"
  3. import initWasm, {sign} from "./pkg/sign.js"; // 通過wasm-pack打包生成的二進制包的入口文件 
  4. import { v4 as uuidv4 } from 'uuid'; // 此示例以生成的UUID作為cnonce隨機字符串 
  5.   
  6. onMounted(async () => { 
  7.     await initWasm() 
  8. }) 
  9.   
  10. const sendRequest = () => { 
  11.     const cnonce = uuidv4() 
  12.     const params: EncryptedParams = { 
  13.         name'John'
  14.         age: 23, 
  15.         breed: 'dog'
  16.         ts: Date.now() 
  17.     } 
  18.     const wasmSignature = sign(JSON.stringify(params), cnonce); 
  19.     ... 
  20.     axios.post(something); 
  21.   
  22. </script> 

簽名機制示例,server端接受到請求時,應該同時獲得簽名值以及cnonce一次性字符串,按照下面同樣的簽名順序進行簽名,比對前端傳入的簽名以及server端生成的簽名進行校驗:

  1. const encryptedSign = (message: string, cnonce: string): string => { 
  2.   const secret = 'XXXXXXX' // 該簽名鹽值可以自行生成,生成之后需要重新編譯rust應用,生成新的wasm包 
  3.   const hashDigest = sha256(`${cnonce}|${message}`) 
  4.   const hmacDigest = Base64.stringify(hmacSHA512(hashDigest.toString().toUpperCase(), secret)) 
  5.   return hmacDigest.toString().toUpperCase() 

簽名機制示例 (rust 版本):

  1. extern crate wasm_bindgen; 
  2.   
  3. use ring::hmac; 
  4. use ring::digest::{Context, SHA256}; 
  5. use data_encoding::BASE64; 
  6. use data_encoding::HEXUPPER; 
  7. use wasm_bindgen::prelude::*; 
  8.   
  9. #[wasm_bindgen] 
  10. pub fn ron_weasley_sign (message: &str, cnonce: &str) -> String { 
  11.     const SECRET: &str = std::env!("SECRET"); 
  12.   
  13.     let mut context = Context::new(&SHA256); 
  14.     context.update(format!("{}|{}", cnonce, message).as_bytes()); 
  15.     let sha256_result = context.finish(); 
  16.     let sha256_result_str = format!("{}", HEXUPPER.encode(sha256_result.as_ref())); 
  17.   
  18.     let key = hmac::Key::new(hmac::HMAC_SHA512, SECRET.as_bytes()); 
  19.     let mac = hmac::sign(&key, sha256_result_str.as_bytes()); 
  20.     let b64_encoded_sig = BASE64.encode(mac.as_ref()); 
  21.     return b64_encoded_sig.to_uppercase(); 

構建rust源代碼,并生成對應的二進制包

首先在項目的github地址

https://github.com/swearer23/ron-weasley 下載源代碼

之后按照README文件的步驟安裝編譯環境(以*nix環境為例)

安裝cargo

由于我們使用cargo作為rust環境的管理器,所以第一步安裝cargo

安裝完成后在命令行輸入cargo -v 查看是否安裝成功

  1. cargo -v # 可能需要重新啟動終端 
  2. Rust's package manager 
  3.  
  4. USAGE: 
  5.     cargo [+toolchain] [OPTIONS] [SUBCOMMAND] 
  6.  
  7. OPTIONS: 
  8.     -V, --version                  Print version info and exit 
  9.         --list                     List installed commands 
  10.         --explain <CODE>           Run `rustc --explain CODE` 
  11.     -v, --verbose                  Use verbose output (-vv very verbose/build.rs output) 
  12.     -q, --quiet                    No output printed to stdout 
  13.         --color <WHEN>             Coloring: auto, always, never 
  14.         --frozen                   Require Cargo.lock and cache are up to date 
  15.         --locked                   Require Cargo.lock is up to date 
  16.         --offline                  Run without accessing the network 
  17.         --config <KEY=VALUE>...    Override a configuration value (unstable) 
  18.     -Z <FLAG>...                   Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details 
  19.     -h, --help                     Prints help information 
  20.  
  21. Some common cargo commands are (see all commands with --list): 
  22.     build, b    Compile the current package 
  23.     check, c    Analyze the current package and report errors, but don't build object files 
  24.     clean       Remove the target directory 
  25.     doc, d      Build this package's and its dependencies' documentation 
  26.     new         Create a new cargo package 
  27.     init        Create a new cargo package in an existing directory 
  28.     run, r      Run a binary or example of the local package 
  29.     test, t     Run the tests 
  30.     bench       Run the benchmarks 
  31.     update      Update dependencies listed in Cargo.lock 
  32.     search      Search registry for crates 
  33.     publish     Package and upload this package to the registry 
  34.     install     Install a Rust binaryDefault location is $HOME/.cargo/bin 
  35.     uninstall   Uninstall a Rust binary 
  36.  
  37. See 'cargo help <command>' for more information on a specific command. 

安裝wasm-pack

 

要構建二進制包,需要一個額外工具 wasm-pack。它會幫助我們把代碼編譯成 WebAssembly 并構建出適用于web環境的wasm包。使用下面的命令可以下載并安裝:

 

  1. cargo install wasm-pack 

編譯wasm

wasm-pack安裝成功后,執行下面的命令以編譯wasm包

  1. SECRET= wasm-pack build --target=web --release 

<your-secret>替換為你的簽名鹽值

第一次構建和編譯時間會比較長,需要下載依賴的rust庫并編譯,請耐心等待

如果速度仍然很慢,建議更換cargo國內源

更換 cargo 源

在你的cargo文件夾下新建 config 文件

macos中,文件夾地址在 ~/.cargo

  1. cd ~/.cargo 
  2. touch config 

然后編輯config文件,添加如下內容:

  1. [source.crates-io] 
  2. registry = "https://github.com/rust-lang/crates.io-index" 
  3. replace-with = 'ustc' 
  4. [source.ustc] 
  5. registry = "git://mirrors.ustc.edu.cn/crates.io-index" 

即可更換為ustc的源

集成

執行wasm-pack命令打包會得到一個名為pkg的文件夾,位于項目的根目錄下

將其放入要使用的前端項目中,即可以像上面代碼示例章節所描述的方式進行集成和調用

附錄

  • rust 項目地址:https://github.com/swearer23/ron-weasley
  • vue3 調用方式示例項目地址:https://github.com/swearer23/harry-porter (內含有secret=123456的wasm包,可以用于示例)

原文地址:https://www.toutiao.com/a7045923113728573982/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 中文字幕视频在线播放 | 激情在线观看视频 | 国产视频在线观看免费 | 久久精品视频免费观看 | 成人福利在线免费观看 | 国产 日韩 亚洲 欧美 | 欧美一级免费高清 | 91色一区二区三区 | 欧美一区二区三区免费电影 | 中文字幕在线观看视频一区 | 亚洲一级片在线观看 | 91一区二区三区久久久久国产乱 | 亚洲精品成人久久久 | 亚洲欧美国产高清va在线播放 | 日韩精品一区二区在线播放 | 成人做爰高潮片免费视频美国 | 美女久久久久久久久 | 午夜a狂野欧美一区二区 | 鲁丝片一区二区三区免费入口 | 国产一级毛片在线看 | 色骚综合 | 久久老司机 | 日本一区二区免费在线观看 | 国产日韩在线观看一区 | 久久精品9 | 羞羞视频免费入口网站 | 中文字幕在线观看视频一区 | 欧美一级电影网 | 国产papa| 一级毛片手机在线观看 | 成人午夜一区二区 | 久久久久久久不卡 | 91精品国产一区二区三区四区在线 | 91成人久久| 亚州精品天堂中文字幕 | 成年片在线观看 | 亚洲精品a在线观看 | 久久不雅视频 | 欧美日韩亚洲在线 | 91免费国产在线观看 | 免费香蕉成视频成人网 |