zoukankan      html  css  js  c++  java
  • 日常开发时遇到的一些坑(三)

    记一次接口开发遇到的问题:

      接口获取的请求参数是AES加密过的,但自己写的DEMO没有任何报错,但通过Postman发送请求时,服务器总是报错:

    javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher

      在后台看日志的时候发现传入的密文中所有的"+"都变成空格了;

    原因是?

      HTTP协议会自动地将URL中的特殊字符转义 :
        1.空格换成加号(+)   
        2.正斜杠(/)分隔目录和子目录   
        3.问号(?)分隔URL和查询   
        4.百分号(%)制定特殊字符   
        5.#号指定书签   
        6.&号分隔参数  

    怎么解决的?

       客户端将加密好的参数进行二进制到十六进制的转换,服务端获取后再逆向操作即可:

        

    /**将二进制转换成16进制
         * @param buf
         * @return
         */
        public static String parseByte2HexStr(byte buf[]) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < buf.length; i++) {
                String hex = Integer.toHexString(buf[i] & 0xFF);
                if (hex.length() == 1) {
                    hex = '0' + hex;
                }
                sb.append(hex.toUpperCase());
            }
            return sb.toString();
        }
    /**将16进制转换为二进制
         * @param hexStr
         * @return
         */
        public static byte[] parseHexStr2Byte(String hexStr) {
            if (hexStr.length() < 1)
                return null;
            byte[] result = new byte[hexStr.length()/2];
            for (int i = 0;i< hexStr.length()/2; i++) {
                int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
                int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
                result[i] = (byte) (high * 16 + low);
            }
            return result;
        }
  • 相关阅读:
    音频文件的属性
    判断UITextField.text是否为空(转)
    digital audio properties
    对scrollView的属性contentSize contentOffset contentInset个人理解
    OC定义变参函数
    va_list、va_start、va_arg、va_end的原理与使用(转载)
    游标笔记
    oracle中删除重复数据
    IIS无法启动,错误代码127[转自Alibaba DBA Team]
    推进游标是Fetch不是Petch!~!
  • 原文地址:https://www.cnblogs.com/Joey44/p/10531727.html
Copyright © 2011-2022 走看看