java SHA1按照value值字典排序后拼key值加密

来源:互联网 发布:好莱客衣柜价格算法 编辑:程序博客网 时间:2024/05/23 01:21

目前很多调用http接口传输数据的程序都用到加密处理,下面介绍一下sha1加密:

加密数据

    Map<String, Object> map=new HashMap<String,Object>();        String key="1234567890";//key值        map.put("maps_uid","aa");        map.put("if_ac","bb");        map.put("if_mod","cc");//所要加密的字符串

SHA1加密

     //获取信息摘要 - 参数字典排序后字符串          String decrypt = getOrderByLexicographic(maps,key);          try {              //指定sha1算法              MessageDigest digest = MessageDigest.getInstance("SHA-1");              digest.update(decrypt.getBytes());              //获取字节数组              byte messageDigest[] = digest.digest();              // Create Hex String              StringBuffer hexString = new StringBuffer();              // 字节数组转换为 十六进制 数              for (int i = 0; i < messageDigest.length; i++) {                  String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);                  if (shaHex.length() < 2) {                      hexString.append(0);                  }                  hexString.append(shaHex);              }              return hexString.toString().toUpperCase();          } catch (NoSuchAlgorithmException e) {              e.printStackTrace();              throw new DigestException("签名错误!");          }  

map的value值按照字典排序

  /**      * 获取参数的字典排序      * @param maps 参数key-value map集合      * @return String 排序后的字符串      */      private static String getOrderByLexicographic(Map<String,Object> maps,String key){          return splitParams(lexicographicOrder(getParamsName(maps)),maps,key);      }      /**      * 获取参数名称 key      * @param maps 参数key-value map集合      * @return      */      private static List<String> getParamsName(Map<String,Object> maps){          List<String> paramNames = new ArrayList<String>();          for(Map.Entry<String,Object> entry : maps.entrySet()){              paramNames.add(entry.getValue().toString());          }          return paramNames;      }      /**      * 参数名称按字典排序      * @param paramNames 参数名称List集合      * @return 排序后的参数名称List集合      */      private static List<String> lexicographicOrder(List<String> paramNames){          Collections.sort(paramNames);          return paramNames;      }      /**      * 拼接排序好的参数名称和参数值      * @param paramNames 排序后的参数名称集合      * @param maps 参数key-value map集合      * @return String 拼接后的字符串      */      private static String splitParams(List<String> paramNames,Map<String,Object> maps,String key){          StringBuilder paramStr = new StringBuilder();          for(String paramName : paramNames){              paramStr.append(paramName);              for(Map.Entry<String,Object> entry : maps.entrySet()){                  if(paramName.equals(entry.getKey())){                      paramStr.append(String.valueOf(entry.getValue()));                  }              }          }          paramStr.append(key);        logger.info("所要拼密钥的字符串:"+paramStr);        return paramStr.toString();    }

结果如下:
这里写图片描述