AndNext接口Java测试

这个文章的目的是, 我希望用postman测试一下andnext的接口, 结果发现里面有几个小问题, 折腾了一下(确切的说是折腾了一天).

1. 是之前文档里面写道, 敏感数据, 比如注册用的密码, 需要加密, 加密方法是Base64, 我试了直接Base64, 拿来加密, 根本不行, 仔细看了一下, 加上后来看了新的在线的文档, 说是"HEX", 就是把byte[]转成了16进制的字符串, 要拿出来得到RSA的公钥,需要先将这个HEX的字符串还原成byte数组, byte是16位的, 16bit, 即字符串的每两个byte组成一个byte, 比如, 它的public key加密后是, 打个比方"30820122300D0609....", 那么, 30, 80, 01, 22...每两位就是一个16进制的byte, 要每两个字符一组, 转成一个byte数组, 当作java security的RSA的X509EncodedKeySpec的构造方法公钥输入.

1private byte[] hexToString(String hexStr) { //先搞清楚数组长度, 是字符串的长度的1/2 2 int arrayLeng = hexStr.length() / 2; 3 System.out.println(arrayLeng); //建结果数组 4 byte[] sourceByteArray = new byte[arrayLeng]; 5 int counter = 0; 6 for (int i = 0; i < arrayLeng; i++) { 7 //(getDecimal(hexStr.substring(i, i = i + 1))) * 16+getDecimal(hexStr.substring(i, i = i + 1)); //每两个字符拿出来, 组成一个byte, 这里很容易就晕菜了, 因为数据结构101告诉我们, 每个字符是8bit,两个字符是16个bit,怎么又还原成一个byte. //方法就是拿第一个出来, 升高位, 再补低位 8 int temp = (getDecimal(hexStr.substring(counter, counter + 1))) * 16 + getDecimal(hexStr.substring(counter + 1, counter + 2)); 9// System.out.println("temp: " + temp); 10 11 byte b = (byte) (temp); 12 13 //System.out.println("b: " + b); 14 sourceByteArray[i] = b; 15 16 //System.out.println("" + i + " : " + sourceByteArray[i]); 17 counter = counter + 2; 18 19 } 20 21 return sourceByteArray; 22 }

这个方法把单独的看上去像16进制的字符, 例如01234EFAB转成一个int

1public static int getDecimal(String hex) { 2 String digits = "0123456789ABCDEF"; 3 hex = hex.toUpperCase(); 4 int val = 0; 5 for (int i = 0; i < hex.length(); i++) { 6 char c = hex.charAt(i); 7 int d = digits.indexOf(c); 8 val = 16 * val + d; 9 } 10 return val; 11 }

你可以理解成这整个hexToString的方法, 代替了Base64的decode, 因为默认RSA拿到公钥字符串是用Base64将字符串进行decode成byte数组之后来使用的, 这个hexStringToArray的方法, 代替了decode的过程.

2. 拿到公钥, 加密完敏感信息, 还要用同样或者反向的方法, 把加密后的数据, 用16进制的字符串形式作为post的数据.

1private static String byteArrayToHexString(byte[] sourceArray) { 2 String resultStr = ""; 3 4 StringBuilder sb = new StringBuilder(); 5 for (byte b : sourceArray) { 6 sb.append(String.format("%02X", b)); 7 } 8 resultStr = sb.toString(); 9 return resultStr; 10 }

所有敏感数据都要经过RSA之后, 再用这个(奇葩的)编码方式编码.

3. 顺利(或者不顺利)的完成注册, 需要调用认证接口的时候, 第二个难关是公共请求头, 他们的认证方法是, 需要AppId, 需要时间码加随机字符作为message, 用AppSecret作为密钥, 这个信息可以找我或者阿楠要.

然后用HmacSHA256加密, 结果再HEX一下, 当作签名Signature, HmacSHA256是什么鬼我没细研究, 估计跟MD5差不多, 算摘要的, 单向, 拿来做签名使.

另外, 所有的必要选项都要放在请求头里面, 不然就会各种"token过期"的错误:

如图, 记住, Signature最后也要转成HEX字符串形式.

1public void SHA356Test() { 2 try { //secret就是AppSecret,阿楠那里有 3 String secret = "dfb00303-f6bc-4fdf....."; 4 String randomStr = getRandomString(12); 5 System.out.println("随机字符串长度为" + randomStr.getBytes().length); //根据文档的说法, message是时间码加上随机字符 6 String message = new Date().getTime() + randomStr; 7 System.out.println(message); 8 Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); 9 SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256"); 10 sha256_HMAC.init(secret_key); 11 System.out.println("hex: " + byteArrayToHexString(sha256_HMAC.doFinal(message.getBytes()))); 12 //String hash = Base64.encode(sha256_HMAC.doFinal(message.getBytes())); 13 //System.out.println(hash); 14 } catch (Exception e) { 15 System.out.println("Error"); 16 } 17 18 }

 这个"hex"的打印结果跟时间码还是随机字符, 都贴到postman里面, 加上之前登陆成功获得的token, 七七八八, 就能认证成功了, 不行的话, 赶紧来问我, 别重复造轮子浪费时间.

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )