【Java】防沉迷实名认证系统接口测试代码(已全示例通过)

2023-09-21 13:46:42

下面的代码以及置顶文件使用并修改了作者:jspp@qq.com的开源代码,只作学习使用,侵删

背景:

在接入Taptap的防沉迷实名认证前,需要先通过国家防沉迷实名认证系统的接口测试,要求全部示例通过才能允许使用接口:
在这里插入图片描述

核心代码:

接口加密需要使用密钥对请求报文体数据进行AES-128/GCM + BASE64算法加密



import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;

public class AESUtil {

//    这个算法在我这边跑不起来,所以换成了下面的那个方法
//    public static String  encrypt(String content, String key) {
//        try {
//            byte[] hexStr = hexToByteArray(key);
//            //加密算法:AES/GCM/PKCS5Padding
//         // 初始化加密算法
//            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//            SecretKeySpec skeySpec = new SecretKeySpec(hexStr, "AES");
//            //随机生成iv 12位
//            byte[] iv = RandomStringUtils.random(12).getBytes();
//            //数据加密, AES-GCM-128
//            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new GCMParameterSpec(128, iv));
//            byte[] encrypted = cipher.doFinal(content.getBytes());          //数据加密
//            //iv+加密数据 拼接  iv在前,加密数据在后
//            ByteBuffer byteBuffer = ByteBuffer.allocate(iv.length + encrypted.length);
//            byteBuffer.put(iv);
//            byteBuffer.put(encrypted);
//            byte[] cipherMessage = byteBuffer.array();
//            //java.util.Base64
//            return java.util.Base64.getEncoder().encodeToString(cipherMessage);
//
//        } catch (Exception e) {
//        	e.printStackTrace();
//            throw new RuntimeException(e);
//        }
//    }
    
    public static String encrypt(String cleartext,String key) {
        try 
        {
        	byte[] hexStr = hexToByteArray(key);
        	SecretKeySpec skeySpec = new SecretKeySpec(hexStr, "AES");
            // encoding format needs thought
            byte[] clearTextbytes = cleartext.getBytes("UTF-8");
            final SecureRandom secureKeyRandomness = SecureRandom.getInstanceStrong();
            final KeyGenerator AES_keyInstance = KeyGenerator.getInstance("AES");
            AES_keyInstance.init(128, secureKeyRandomness);
            final Cipher AES_cipherInstance = Cipher.getInstance("AES/GCM/NoPadding");
            AES_cipherInstance.init(Cipher.ENCRYPT_MODE, skeySpec);
            byte[] encryptedText = AES_cipherInstance.doFinal(clearTextbytes);
            byte[] iv = AES_cipherInstance.getIV();
            byte[] message = new byte[12 + clearTextbytes.length + 16];
            System.arraycopy(iv, 0, message, 0, 12);
            System.arraycopy(encryptedText, 0, message, 12, encryptedText.length);
            return java.util.Base64.getEncoder().encodeToString(message);
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    public static byte[] hexToByteArray(String hex) {
        int l = hex.length();
        byte[] data = new byte[l / 2];
        for (int i = 0; i < l; i += 2)
        {
            data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                    + Character.digit(hex.charAt(i + 1), 16));
        }
        return data;
    }

}

使用SHA256算法对待加密字符串进行计算


import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Sha256Utils {

    /**
     * 利用java原生的类实现SHA256加密
     * @param str 加密后的报文
     * @return
     */
    public static String getSHA256(String str){
        MessageDigest messageDigest;
        String encodestr = "";
        try {
            messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(str.getBytes("UTF-8"));
            encodestr = byte2Hex(messageDigest.digest());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return encodestr;
    }
    /**
     * 将byte转为16进制
     * @param bytes
     * @return
     */
    private static String byte2Hex(byte[] bytes){
        StringBuffer stringBuffer = new StringBuffer();
        String temp = null;
        for (int i=0;i<bytes.length;i++){
            temp = Integer.toHexString(bytes[i] & 0xFF);
            if (temp.length()==1){
                stringBuffer.append("0");
            }
            stringBuffer.append(temp);
        }
        return stringBuffer.toString();
    }

}

坑爹的点:

  1. 接口测试中使用的AppId、密钥等并非Taptap那边的数据,而是网络游戏防沉迷实名认证系统中的相关数据:
    在这里插入图片描述
  2. 测试数据要尽可能多地使用《网络游戏防沉迷实名认证系统测试系统说明》中的所有数据,数据集一定要够多,有部分数据是有规律的,可以类推更多的其他数据,加大训练集,比如这些:
    在这里插入图片描述
  3. 出现错误码:1005 SYS REQ IP ERROR (接口请求IP地址非法),应该是在网络游戏防沉迷实名认证系统的IP白名单中没有填入公网IP:
    在这里插入图片描述
  4. 出现错误码:1007 SYS REQ EXPIRE ERROR (接口请求过期) ,原因是传入的timestamp没有算东八区的时间戳(单位毫秒),在Java中比较简单,直接用System.currentTimeMillis(),但是其他编程语言要记得算上时区
  5. 出现错误码:1011 SYS REQ PARTNER AUTH ERROR(接口请求方身份核验错误),原因是上面提到的接口加密算法(AES-128/GCM + BASE64加密)或者 SHA256算法加签算法有问题,可以直接参考一下上述Java版的代码
  6. 出现错误码:1012 SYS REQ PARAM CHECK ERROR (接口请求报文核验失败),看一下自己报文的拼接是否出现了问题,要严格按照文档的格式来拼接,详情可以看我置顶文件,里面有整个maven项目
  7. 出现错误码:4002 TEST TASK NOT EXIST (测试任务不存在),原因是某一项测试数据已经通过了,这个测试数据就不能再用了,也有可能是你的测试码过期了,更新一下测试码即可
    在这里插入图片描述
更多推荐

聊聊交互设计师的成长 优漫动游

1.交互设计师应当具备的能力聊聊交互设计师的成长如果我们简单的将用户体验领域涉及到的技能分为:用户研究、产品(概念/功能)设计、交互设计、视觉设计、工程技术,我认为任何一个交互设计师和视觉设计师等等,都应该具有整体的复合技能,只是哪部分更多哪部分更少的问题。1)用户研究:对于交互设计师,不具备基本的用户研究能力,无法吸

AMS爆炸来袭,上线即巅峰

1.关于首发项目Antmons(AMS)空投结果Gate.ioStartup首发项目Antmons代币AMS于Aug15th,AM07:00开始下单,24小时内下单同等对待总共有15,950人下单,下单总价值超过1,000万美金分发系数约为0.001640495298341。根据上线规则AMS项目认购成功,Gate.i

跨进程数据共享技术

跨进程数据共享技术是指在不同的计算进程之间实现数据共享的方法和技术。这种技术通常用于多任务操作系统或分布式系统中,以便不同的程序或进程能够在运行时共享数据,从而实现协同工作或实现某些特定的功能。以下是一些常见的跨进程数据共享技术:进程间通信(Inter-ProcessCommunication,IPC):IPC是一种广

SpringBoot+Jpa+Thymeleaf实现增删改查

SpringBoot+Jpa+Thymeleaf实现增删改查这篇文章介绍如何使用Jpa和Thymeleaf做一个增删改查的示例。1、pom依赖pom包里面添加Jpa和Thymeleaf的相关包引用<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://mave

Linux 信号集 及其 部分函数

这几个函数都是对自己自定义的信号集操作intsigemptyset(sigset_t*set)功能:清空信号集中的数据,将所有的标志位置为0参数:set需要操作的信号集返回值:成功0失败-1intsigfillset(sigset_t*set)功能:清空信号集中的数据,将所有的标志位置为1参数:set需要操作的信号集返

数据结构---二叉搜索树

二叉搜索树二叉搜索树什么是二叉搜索树?二叉搜索树的操作查找插入删除源代码非递归版二叉搜索树什么是二叉搜索树?二叉搜索树(BinarySearchTree简称BST)又称二叉排序树,是一种二叉树的特殊形式,它在每个节点上存储的键值满足以下性质:若它的左子树不为空,则左子树上的所有节点的值都小于根节点的值若它的右子树不为空

数据结构--7.1散列表(哈希表)查找

散列表查找我们要在a[]中查找key关键字的记录:——顺序表查找:挨个儿查找——有序表查找:二分法查找——散列表查找记录的存储位置=f(关键字)散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。这里我们把这种对应关系f称为散列函数,又成为哈希(Hash

EM算法和VAE的学习笔记

文章目录摘要EM算法流程EM算法对GMM的参数估计EM算法的证明EM算法的另一种理解VAE参考文献摘要这是我学习EM算法(Expectation-MaximizationAlgorithm)和VAE(VariationalAuto-Encoder)的学习笔记,首先总结了EM算法流程,然后举了一个例子,用EM算法对GMM

【karle 笔记】QQ机器人jdk17版本下载和安装

这里写自定义目录标题下载地址安装JDK:安装JRE验证安装成功下载地址https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe下载后,是一个exe文件,傻瓜式安装即可安装JDK:直接用安装包安装,默认安装路径在:C:\ProgramFil

ChatGPT技术原理

目录一、Tokenization二、Transformer模型三、预训练四、微调五、Beamsearch总结自从OpenAI的ChatGPT在2022年底横空出世以来,这款大型语言模型在各种任务中都展现了惊人的性能,包括问答、对话、文本生成等。ChatGPT以其卓越的性能和高效的处理能力,引领了自然语言处理(NLP)领

vue/react/node项目通过eslint检查语法规范

首先我们打开终端全局安装依赖npminstall-geslint然后以管理员身份运行项目终端输入eslint--init然后这里在初始化时会问我们想如何使用它?分别对应仅检查语法检查语法并发现问题检查语法、发现问题并强制执行代码样式这里建议第二种第三种肯定是不行的然后问我们您的项目使用哪种类型的模块?JavaScrip

热文推荐