• JMETER也会遇到加密难题,中文乱码也能一并处理


    一、加密的接口测试

    不管是接口测试还是性能测试,在遇到接口有加密入参的时候,该怎么办?

    • 毫无疑问,放弃自己实现的想法,除非自己很懂,别装了,还是先问问开发算法名称是啥吧!

    于是从开发手中拿到了加密代码,从代码结构上看是没问题,开发也是调用别人写好的算法,只不过加入了自己的密钥和选择不同的加密方式而已。但是开发齐刷刷的丢了三个java文件过来,笔者瞬间惊呆了,因为只要一个加密方法的java文件即可,于是笔者终于选出了正确的代码。

    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import org.bouncycastle.util.encoders.Base64;
    
    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.Key;
    import java.security.Security;
    import java.util.Arrays;
    
    public class AESUtil {
    
        // 算法名称
        final static String KEY_ALGORITHM = "AES";
        // 加解密算法/模式/填充方式
        final static String ALGORITHM_PKCS7 = "AES/CBC/PKCS7Padding";
        final static String ALGORITHM_ZERO = "AES/CBC/ZEROBYTEPADDING";
        private Key key;
        private Cipher cipher;
    
        byte[] iv = {0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38};
    
        private void init(byte[] keyBytes, String algorithmStr) {
            // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
            int base = 16;
            if (keyBytes.length % base != 0) {
                int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
                byte[] temp = new byte[groups * base];
                Arrays.fill(temp, (byte) 0);
                System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
                keyBytes = temp;
            }
            // 初始化
            Security.addProvider(new BouncyCastleProvider());
            // 转化成JAVA的密钥格式
            key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
            try {
                // 初始化cipher
                cipher = Cipher.getInstance(algorithmStr, "BC");
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 加密方法
         *
         * @param content 要加密的字符串
         * @param pwd     加密密钥
         * @return Base64
         */
        public byte[] encrypt(String content, String pwd) {
            init(pwd.getBytes(), ALGORITHM_PKCS7);
            try {
                cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
                byte[] encryptedText = cipher.doFinal(content.getBytes());
                return Base64.encode(encryptedText);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 上面的代码片段,用了一个工具包bouncycastle,记得在maven项目中pom添加依赖哦
        <dependency>
          <groupId>org.bouncycastlegroupId>
          <artifactId>bcprov-jdk16artifactId>
          <version>1.46version>
        dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    二、导出jar包,放入jmeter的lib/ext扩展目录

    以上代码当然是在java编辑工具里调试的,但是它要在jmeter何处使用呢?

    • JMeter登场,笔者习惯使用jmeter来完成性能测试任务;至于怎么导出可用的jar,可以百度问问他人,因为笔者导出的方式(当然也是别人的方式),最终得到了如下错误,就是,嗯,包没打齐活的意思。
    2022-11-07 10:26:21,322 ERROR o.a.j.r.ClassFinder: Error filtering class org.bouncycastle.x509.extension.AuthorityKeyIdentifierStructure, it will be ignored
    java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
    
    • 1
    • 2

    在这里插入图片描述

    • 那到这里笔者是放弃了吗?很显然,这不是笔者的风格,JMeter工具的beanshell元件即可导包也可编写java片段的代码
      在这里插入图片描述

    前面说了,该加密方法用了一个工具包bouncycastle,记得也要把它的jar包放在lib/ext里,不然你的beanshell就调用不到了
    在这里插入图片描述
    温馨提示:beanshell脚本的好处,就是它没有最外层的类名,方法直接写,直接调用即可;还有它不用写自己的包路径,直接导你需要的包即可。要是不会就来找笔者吧!

    三、JMeter输出中文乱码示例

    这是个很常见的问题,基本很多时候都能莫名其妙的遇到,当然笔者也提供了几种方式可供调试
    在这里插入图片描述

    • 修改jmeter.properties文件的sampleresult.default.encoding字符集,默认是ISO-8859-1,改成utf-8
    • 或者在sampler请求之前增加beanshell元件,代码:prev.setDataEncoding(“utf-8”);
    • 又或者在sampler的content encoding输入:utf-8
      在这里插入图片描述

    解决,调试一下,结果输出如下,完美!
    在这里插入图片描述

    四、总结

    这里也会遇到粉丝常问的一个问题,beanshell怎么用?外部jar怎么在jmeter中使用?这简直很要命,因为在问之前,自己没有深入思考,至少没有看过jmeter官方操作手册,总是在我行我素、一意孤行,让自己陷入无法解决问题的深渊;正如笔者记录的一样,既然jar导出在jmeter用不起来,那么就把代码在beanshell应用起来,总有一款方法适合你;所以共勉!日拱一卒无有尽,功不唐捐终入海!

  • 相关阅读:
    电脑硬件——CPU散热器
    Jtti:Ubuntu下如何迁移Thunderbird邮件
    【初阶数据结构】——单链表详解(C描述)
    NLP中的对比学习:ConSERT\EsimCSE
    uniapp echarts 适配H5与微信小程序
    CData Drivers for Azure Active Directory
    5、JAVA入门——变量和数据类型1
    关于MicroPython mpremote工具 的一些用例,闲聊
    webpack如何处理css
    mysql问题汇总
  • 原文地址:https://blog.csdn.net/u011466469/article/details/127726495