我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue如何实现对请求参数进行签名

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue如何实现对请求参数进行签名

前端实现请求签名

前端对请求参数进行加密作为签名。

1、思路

一般请求参数种类

1.路径参数

  • 会出现在url上

2.params参数

  • 会出现在url上
  • 所以可以将url一起进行签名

3.post的请求体参数(body)

  • 可以将post请求的data数据进行排序、然后拼接成一个字符串然后与其他参数一起进行签名

防止重复请求

  • 可以添加时间戳,1分钟内相同的请求为重复请求不给予放行
  • 将每个请求添加唯一id,存入redis设置1分钟过期

密钥

因为加密算法是公开的,所以我们可以添加密钥进入签名,这样即使对方知道签名的加密算法,但是没有密钥也是无法串改请求的

  • RSA 加密算法 (非对称加密算法)
  • 通过公钥加密私钥解密,来增加安全性。
  • 简化:也可以使用随机数作为密钥,这样安全系数较低,但容易实现

加密

  • 选择MD5算法对参数进行加密,会使用到js-md5库

经过以上的梳理,我们可以大致明白,需要将可以被修改的参数进行加密成签名。

签名:MD5( postData ? + url + 时间戳 + 请求唯一id + 密钥 )

2、Vue实现添加请求签名

代码如下:

3、axios请求拦截器实现

import axios from 'axios"
import {signatureGenerate} from "../utils/signatureUtil"

const request = new axios.create({
    timeout: 3000
})

// 请求拦截器
request.interceptors.request.use((config) => {

  // 获取请求头参数
  const {signature, timestamp, secret} = signatureGenerate(config)
  // 分别将签名、密钥、时间戳 至请求头 
  if(signature) config.headers["signature"] = signature
  if(secret) config.headers["key"] = secret
  if(timestamp) config.headers["timestamp"] = timestamp 
  // 这里未添加请求唯一id 各位可以自己实现以下,作者偷下懒 ~ ~
    
  return config
});

export default request

4、生成签名工具类

// signatureUtil.js
import md5 from "js-md5";
export function signatureGenerate({data, url, headers}){
    // 参数签名 密钥 + 时间戳 + header参数 + url

    // 密钥
    let secret = Math.random().toString(36).substr(2)
    // 时间戳
    let timestamp = new Date().getTime()     
    // token
    let token = headers.Authorization
    // post参数
    let dataStr = dataSerialize(dataSort(data))
    // 生成签名
    let str = dataStr + "secret=" + secret + "&timestamp=" + timestamp + "&url=" + url
    
    const sign = md5(str)
    
    return {
        signature: sign.toUpperCase(), // 将签名字母转为大写
        timestamp,
        secret
    }
}

// 参数排序
function dataSort(obj){
    if (JSON.stringify(obj) == "{}" || obj == null) {
        return {}
    }
    let key = Object.keys(obj)?.sort()
    let newObj = {}
    for (let i = 0; i < key.length; i++) {
        newObj[key[i]] = obj[key[i]]        
    }
    return newObj
}

// 参数序列化
function dataSerialize(sortObj){
    let strJoin = ''
    for(let key in sortObj){
        strJoin += key + "=" + sortObj[key] + "&"
    }

    // return strJoin.substring(0, strJoin.length - 1)
    return strJoin
}

小结:

其实前端实现起来比较简单,但是还可以继续对axios进行封装,其实并不是所有的请求都需要签名。大家可以自行思考~~

我的问题就是卡在后端获取这些参数的时候浪费了很多时间。

后端API接口校验签名的实现也会陆续发布!

请求参数按照ASCII码从小到大排序后追加秘钥再进行加密得到签名值

最近在和银行对接一些就接口,甲方对于我们接口数据要求如下:

 1、双方需要采用https双向认证方式传输数据 

 2、请求参数采用全报文加密方式

 3、请求参数按照ASCII码从小到大排序后追加秘钥再进行加密得到签名值

本文主要介绍一下签名的生成工具类代码;

Step 1:

  • 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的 格式(即 key1=value1&key2=value2...) 拼接成字符 string1 。          
  • 注意:为空的参数不参与签名。

Step 2:

  • 在第一步中 string1 最后拼接上 key=Key(密钥)得到 stringSignTemp 字符串,并对 stringSignTemp 进行 md5 运算,再将得到 的字符串所有字符转换为大写,得到 sign 值 signValue。    
  • 注意:KEY 最多 32 个字符(不包含特殊符号)

代码实现

1、将对应的model转换为map

public static Map<String, Object> objectToMap(Object obj) throws Exception {
        if (obj == null)
            return null;
 
        TreeMap<String, Object> map = new HashMap<String, Object>();
 
        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor property : propertyDescriptors) {
            String key = property.getName();
            if (key.compareToIgnoreCase("class") == 0) {
                continue;
            }
            Method getter = property.getReadMethod();
            Object value = getter != null ? getter.invoke(obj) : null;
            map.put(key, value);
        }
 
        return map;
    }

注意:将实体经过上面工具类转换完成以后,已经按照参数的ACII码排序了

2、生成签名工具类

package com.jack.common.utils;
 
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
 

public class SignatureUntils {
    
    static public String signForInspiry(Map params, String key) {
 
        StringBuffer sbkey = new StringBuffer();
        Set es = params.entrySet();
        Iterator it = es.iterator();
 
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            String k = (String) entry.getKey();
            Object v = entry.getValue();
            //空值不传递,不参与签名组串
            if (null != v && !"".equals(v)) {
                sbkey.append(k + "=" + v + "&");
            }
        }
        System.out.println(sbkey);
        sbkey = sbkey.append("key=" + key);
 
        //MD5加密,结果转换为大写字符
        String sign = toMD5(sbkey.toString()).toUpperCase();
        return sign;
    }
    
    public static String toMd5(String str) {
        String re = null;
        byte encrypt[];
        try {
            byte[] tem = str.getBytes();
            MessageDigest md5 = MessageDigest.getInstance("md5");
            md5.reset();
            md5.update(tem);
            encrypt = md5.digest();
            StringBuilder sb = new StringBuilder();
            for (byte t : encrypt) {
                String s = Integer.toHexString(t & 0xFF);
                if (s.length() == 1) {
                    s = "0" + s;
                }
                sb.append(s);
            }
            re = sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return re;
    }
 
}

3、测试代码

 public static void testSingn(){
        try {
            Row row = new Row();
            row.setISINUSE("1");
            row.setCALLTIME("2019");
            row.setSERIALNO("123");
            row.setTALKTIME("344");
 
            Map<String, Object> map = ObjectMapConvert.objectToMap(row);
            String qwertyu = SignatureUntils.signForInspiry(map, "123456");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4、如果参数直接采用map方式,则需要采用有序的map

SortedMap<Object,Object> params = new TreeMap<Object,Object>();  
params.put("id",appid);
params.put("name",name);
params.put("age",age);
params.put("sign",signForInspiry(params,"123456")); 

到这获得签名的方法完成。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue如何实现对请求参数进行签名

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue如何实现对请求参数进行签名

这篇文章主要介绍了vue如何实现对请求参数进行签名问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-28

RestTemplate Get请求如何实现bean参数传递

今天小编给大家分享一下RestTemplate Get请求如何实现bean参数传递的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下
2023-07-04

如何进行Postman配置多环境请求地址的实现

如何进行Postman配置多环境请求地址的实现,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。作用:平时用postman测试接口时,同一个接口免不了要在多个环境测试,但是每次
2023-06-26

如何使用Go语言实现路由的请求参数验证

如何使用Go语言实现路由的请求参数验证在实际的开发中,我们经常需要对接收到的请求参数进行验证,以确保数据的有效性和安全性。使用Go语言编写服务端程序时,通过路由来处理请求是常见的做法。本文将介绍如何使用Go语言实现路由的请求参数验证,并附上
如何使用Go语言实现路由的请求参数验证
2023-12-17

vue-cli如何实现异步请求返回mock模拟数据

这篇文章主要为大家展示了“vue-cli如何实现异步请求返回mock模拟数据”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue-cli如何实现异步请求返回mock模拟数据”这篇文章吧。  在前
2023-06-29

Shell(())如何实现对整数进行数学运算

这篇文章主要介绍“Shell(())如何实现对整数进行数学运算”,在日常操作中,相信很多人在Shell(())如何实现对整数进行数学运算问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Shell(())如何实现
2023-06-09

如何通过实现ThreadFactory来对线程进行命名

这篇文章主要介绍如何通过实现ThreadFactory来对线程进行命名,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文记录@Async的基本使用以及通过实现ThreadFactory来实现对线程的命名。@Async
2023-06-15

Python发送Post请求之如何实现根据参数位置传参、数据类型、不同方式传参

本篇内容介绍了“Python发送Post请求之如何实现根据参数位置传参、数据类型、不同方式传参”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
2023-06-15

如何java中使用DecimalFormat实现对数字进行格式化

这期内容当中小编将会给大家带来有关如何java中使用DecimalFormat实现对数字进行格式化,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。java 使用DecimalFormat进行数字的格式化实例
2023-05-31

python如何实现按照键或者数值对字典进行排序

这篇文章主要介绍python如何实现按照键或者数值对字典进行排序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!如何实现按照键或者数值对字典进行排序# 按照键或者数值对字典进行排序dict3 = {"low" : 3,
2023-06-27

使用Hibernate如何实现对数据库进行增删改查操作

使用Hibernate如何实现对数据库进行增删改查操作?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Hibernate对数据删除操作删除User表中个一条数据,是需要更具U
2023-05-31

使用Mybatis如何实现对数据库进行增删改查操作

本篇文章为大家展示了使用Mybatis如何实现对数据库进行增删改查操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是 MyBatis?MyBatis 是支持普通 SQL 查询,存储过程和高级映
2023-05-31

Python如何实现对某地区二手房房价进行数据分析

这篇文章主要介绍了Python如何实现对某地区二手房房价进行数据分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。房价数据分析数据简单清洗data.csv数据显示# 导入模块
2023-06-21

Python如何对MySQL中的大量数据进行批量处理?(在Python中怎样实现对MySQL大数据的批量操作?)

本教程详细介绍了Python中对MySQL大量数据的批量处理方法,包括批量插入、更新和删除。它涵盖了使用executemany()函数、VALUES语法、WHERE子句和性能优化技巧。代码示例提供了如何完成这些操作的实际指导。通过使用这些技术,开发人员可以提高批量数据处理的效率,从而节省时间并优化数据库性能。
Python如何对MySQL中的大量数据进行批量处理?(在Python中怎样实现对MySQL大数据的批量操作?)
2024-04-02

PHP中的事务处理是如何实现的?(请解释PHP中进行数据库事务处理的步骤。)

PHP中事务处理可确保数据库操作要么全部成功执行,要么全部回滚失败。它通过开始事务、执行操作、提交或回滚事务以及异常处理来实现。PHP事务处理遵循ACID属性,包括原子性、一致性、隔离性和持久性。最佳实践包括只在需要时使用事务,保持事务简洁,避免复杂操作,并始终处理异常以防止数据不一致。
PHP中的事务处理是如何实现的?(请解释PHP中进行数据库事务处理的步骤。)
2024-04-02

Python中如何对MySQL数据库进行备份和恢复操作?(通过Python如何实现MySQL数据库的备份与恢复?)

本文介绍了如何使用PythonMySQLdb库对MySQL数据库进行备份和恢复。备份涉及导出数据库到文件,而恢复涉及从文件导入数据库。自动化过程可以使用调度器(如cron)来安排定期备份和恢复。本文提供了详细的步骤和代码示例,使读者能够轻松地实施这些操作,确保数据的安全性和完整性。
Python中如何对MySQL数据库进行备份和恢复操作?(通过Python如何实现MySQL数据库的备份与恢复?)
2024-04-02

Python中如何实现MySQL数据库查询结果的分页显示?(在Python中,如何对MySQL查询结果进行分页处理?)

在Python中对MySQL查询结果进行分页,可用以下方法:使用MySQLLIMIT和OFFSET子句使用Python切片操作符使用SQLAlchemy分页对象使用Django分页器
Python中如何实现MySQL数据库查询结果的分页显示?(在Python中,如何对MySQL查询结果进行分页处理?)
2024-04-02

编程热搜

目录