zoukankan      html  css  js  c++  java
  • 使用jmeter对字符串进行加密

    之前介绍过如何利用jmeter函数助手构造时间戳参数,本次再来研究下另一个功能:对字符串进行加密

    下面通过一个例子来演示一下如何对请求参数进行md5加密

    准备工作

    这次仍然使用百度通用翻译接口当做案例,因为它刚好有一个参数就是经过md5加密得来的

    之前用postman来发送这种有md5加密参数的请求时,也是用百度翻译做的例子,传送门:postman(十二):发送携带md5签名、随机数等参数的请求

    接口文档如下

     一些说明

    1、签名是为了保证调用安全,使用MD5算法生成的一段字符串,生成的签名长度为 32位,签名中的英文字符均为小写格式;
    2、为保证翻译质量,请将单次请求长度控制在 6000 bytes以内。(汉字约为2000个);
    3、签名生成方法如下:
    (1)将请求参数中的 APPID(appid), 翻译query(q, 注意为UTF-8编码), 随机数(salt), 以及平台分配的密钥(可在管理控制台查看)
    按照 appid+q+salt+密钥 的顺序拼接得到字符串1
    (2)对字符串1做md5,得到32位小写的sign
    官方举例:将apple从英文翻译成中文:
    请求参数:
    q
    = apple from = en to = zh appid = 2015063000000001 salt = 1435660288 平台分配的密钥: 12345678
    生成sign: >拼接字符串1
    拼接appid
    =2015063000000001+q=apple+salt=1435660288+密钥=12345678 得到字符串1 =2015063000000001apple143566028812345678
    >计算签名sign(对字符串1做md5加密,注意计算md5之前,串1必须为UTF-8编码) sign=md5(2015063000000001apple143566028812345678) sign=f89f9594663708c1605f3d736d01d2d4
    完整请求为: http:
    //api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4

    使用jmeter来实现

    先把接口参数录入到jmeter

    其中,sign就是把 appid+q+salt+秘钥 拼接并经过md5加密后得到的

    所以我们这次要做的就是对 “appid+q+salt+秘钥”进行加密

    我目前用的jmeter版本是5.0,当前版本的函数助手中有2个函数可以实现字符串加密的功能:__digest  __MD5
     
    __digest

     谷歌硬核翻译:

    Digest algorithm:加密算法,可以填写上图所示的那些,如MD2、MD5等

    String to be hashed:把需要加密的字符串填写到这里

    后面3个参数是选填

    如果按照当前写死的参数来进行加密的话,String to be hashed处应该填写:2015063000000001+钢铁侠+1435660288+12345678,如下

     

     这样就生成了一个加密字符串,把它填写到sign处就好了

    但是有一点必须注意,在参数中: q 代表需要翻译的字符,salt 是一个随机数,这两个参数都是动态变化的(因为每次翻译的字符不同、每次生成的随机数也不同)

    所以在生成sign加密字符串时,不能用写死的 q 和 salt

    因为在请求中定义好了参数q和salt以及appid等,所以接下来我尝试了如下写法

     在实际运行时,得不到正确的响应结果,总是提示sign不合法(猜测可能在函数助手中不能引用外部变量,或者是引用的方式不对,总之这个方法我没有走通)

     __MD5函数 也存在这个问题,不再做赘述
     
    网上冲浪一番后找到了另一种实现方式:使用beanshell脚本对字符串md5加密
     
    在jmeter的lib目录下,自带commons-codec-1.11.jar(如果没有,可以到maven库下一个,下载地址:https://mvnrepository.com/,然后放到jmeter的lib目录下),所以,可以借助apache工具类DigestUtils实现字符串加密

     针对这个翻译接口,做一下如下改造

    1、在请求前添加一个配置元件:【用户定义的变量】,把可能变化的请求参数加到里面

     

    2、在请求下面添加一个BeanShell PreProcessor,里面的脚本如下

    第二行表示把 “appid+q+salt+秘钥”进行加密(这里就是从用户定义的变量中把对应参数的值取过来),把生成的加密字符串赋给sign

    第三行表示定义一个变量msign,并把加密后的字符串传给msign

    import org.apache.commons.codec.digest.DigestUtils;
    String sign = DigestUtils.md5Hex("${appid}${q}${salt}ABCDEFGOAwerfdt8434ed");
    vars.put("msign", sign); 

    3、在http请求中引用这些定义好的参数变量

     运行一下查看结果

    请求内容

     响应结果

     说明生成的加密字符串是合法能用的

     有兴趣可以看看这篇:https://www.cnblogs.com/uncleyong/p/9429752.html#_label4,介绍了多种生成加密字符串的方法

  • 相关阅读:
    JVM 类加载过程
    JVM调优总结 -Xms
    JVM 内存模型
    git克隆远程项目并创建本地对应分支
    内存泄漏 和 内存溢出
    weblogic 乱码
    tomcat 、NIO、netty 本质
    Anything is possible if you have got enough nerve.
    maven build 的时候,卡死在Downloading metadata的解决方法
    TimeUnit
  • 原文地址:https://www.cnblogs.com/hanmk/p/13204243.html
Copyright © 2011-2022 走看看