#!/bin/bash HEX_DIGITS=(0 1 2 3 4 5 6 7 8 9 a b c d e f) generateSignature() { local secret=$1 local timestamp=$2 local value="${secret}${timestamp}" local md5_hash=$(echo -n "${value}" | md5sum | awk '{print $1}') local formatted_text="" for ((i = 0; i < ${#md5_hash}; i += 2)); do hex_pair=${md5_hash:i:2} dec_value=$((16#$hex_pair)) first_char_index=$((dec_value / 16)) second_char_index=$((dec_value % 16)) formatted_text+="${HEX_DIGITS[first_char_index]}${HEX_DIGITS[second_char_index]}" done echo "$formatted_text" } SECRET="31cfa56c-02ba-45cc-8502-3f64a7aebb8c" TIMESTAMP=$(date +%s) SIGNATURE=$(generateSignature "$SECRET" "$TIMESTAMP") API_URL="http://api-in.stone.netease.com/kuafu/api/v3/form/submit" REQUEST_URL="${API_URL}?gwClientId=724\ &gwClientUser=wb.zhangjian17\ &gwTimestamp=${TIMESTAMP}\ &gwSignature=${SIGNATURE}" headers='Content-Type: application/json' payload='{ "processDefId": "申请夸父OpenApi权限:4:21194470", "variables": { "用途": "调用夸父API进行创建工单", "是否公开": "否", "产品名称": "{\"productId\":\"91454\",\"productValue\":\"夸父系统\",\"responsorValue\":\"[email protected]\"}", "stone网关应用名称": "yjz-test", "负责人": "H17793", "stone网关应用ID": "182", "申请访问的API列表": "api/v2/form/submit", "跟踪者": "H17793", "工单优先级": "普通" } }' response=$(curl -X POST -H "$headers" --data "$payload" "$REQUEST_URL") if [ $? -eq 0 ]; then echo "Success: $response" else echo "Error occurred: $response" fi
时间: 2025-04-07 15:15:43 浏览: 1095
您提供的是一段 Bash 脚本,用于生成签名并发送 HTTP 请求到指定的 API 端点。以下是脚本的功能分解及解释:
---
### **功能概述**
该脚本的主要目的是通过 MD5 哈希算法对密钥 (`SECRET`) 和时间戳 (`TIMESTAMP`) 进行加密处理,并将结果作为 `gwSignature` 参数附加到请求 URL 中,最终向目标 API 发送一个 JSON 格式的 POST 请求。
---
### **详细解析**
#### **1. 定义十六进制字符数组**
```bash
HEX_DIGITS=(0 1 2 3 4 5 6 7 8 9 a b c d e f)
```
这是一个包含所有十六进制数字和字母的数组,后续会用它来重新格式化哈希值的结果。
---
#### **2. 定义函数 `generateSignature()`**
这个函数的作用是对输入字符串(由 `SECRET` 和当前时间戳拼接而成)计算其 MD5 值,并将其转换为自定义格式化的文本。
**关键步骤:**
- 使用 `md5sum` 计算原始字符串的 MD5 值;
- 遍历 MD5 结果字符串的每两个字符,将其从十六进制转为十进制;
- 将每个十进制数按位映射回上述 `HEX_DIGITS` 数组中的字符。
示例流程:
假设 MD5 的某部分是 `"ab"`:
1. 转换为十进制:`(int)"ab" = 171`;
2. 分解指数:
- 第一位索引 `first_char_index = floor(171 / 16) = 10 (对应 'a')`;
- 第二位索引 `second_char_index = 171 % 16 = 11 (对应 'b')`.
因此 `"ab"` 最终会被保留原样。
---
#### **3. 设置全局变量**
```bash
SECRET="31cfa56c-02ba-45cc-8502-3f64a7aebb8c"
TIMESTAMP=$(date +%s)
SIGNATURE=$(generateSignature "$SECRET" "$TIMESTAMP")
```
这里设置了三个核心参数:
- `SECRET`: 固定的安全密钥;
- `TIMESTAMP`: 当前 Unix 时间戳;
- `SIGNATURE`: 调用前面定义好的 `generateSignature` 函数生成签名。
---
#### **4. 构造请求地址**
```bash
API_URL="http://api-in.stone.netease.com/kuafu/api/v3/form/submit"
REQUEST_URL="${API_URL}?gwClientId=724\
&gwClientUser=wb.zhangjian17\
&gwTimestamp=${TIMESTAMP}\
&gwSignature=${SIGNATURE}"
```
构造了完整的 API 请求链接,其中包含了客户端 ID、用户信息、时间戳以及之前生成的签名等必要参数。
---
#### **5. 构建请求头与负载**
```bash
headers='Content-Type: application/json'
payload='{...}'
```
设置请求头部内容类型为 `application/json`,同时构建了一个复杂的 JSON 数据包作为请求体,其中包括工作流相关的各种字段。
---
#### **6. 执行 curl 操作**
```bash
response=$(curl -X POST -H "$headers" --data "$payload" "$REQUEST_URL")
```
使用 `curl` 工具发起 HTTPS POST 请求,获取服务器响应数据存储在 `$response` 变量中。
---
#### **7. 判断返回状态**
最后检查命令执行的状态码,若成功则打印出服务器返回的内容;否则提示错误消息。
---
### **总结**
此脚本是一个典型的基于 HMAC-MD5 签名机制的身份验证过程,适用于需要安全通信的场景。通过对时间和随机因素的引入可以有效防止重放攻击等问题。
---
###
阅读全文
相关推荐









