Sign+盐签名算法使用总结

使用Sign+盐签名算法可进行简单的入参和防篡改校验,针对相对安全级别较高的系统需要使用数字证书,但是安全的处理没有绝对的银弹。
	public static String sign(Map<String, Object> params, String signKey) throws Exception {
		if (params == null || params.isEmpty() || params.size() == 0) {
			return null;
		}

		List<String> keyList = new ArrayList<>(params.keySet());
		Collections.sort(keyList);
		int size = keyList.size();

		StringBuilder builder = new StringBuilder("{");
		for (int i = 0; i < size; i++) {
			String key = keyList.get(i);
			Object value = params.get(key);
			builder.append(key + "=" + value + "&");
		}
		builder.append("skey=" + signKey);
		// 此处可使用DigestUtils来实现
		return md5Password(builder.toString());
	}

	public static String md5Password(String signStr) {
		try {
			MessageDigest digest = MessageDigest.getInstance("md5");
			byte[] result = digest.digest(signStr.getBytes());
			StringBuffer buffer = new StringBuffer();
			for (byte b : result) {
				// 加盐处理
				int number = b & 0xff;
				String str = Integer.toHexString(number);
				if (str.length() == 1) {
					buffer.append("0");
				}
				buffer.append(str);
			}
			return buffer.toString();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return "";
		}
	}
总结
  • 将所有的请求参数按照参数名ASCII码从小到大排序
  • 将排序后的参数按照URL键值对的格式拼接成字符串signStr
  • 将signStr进行MD5加密运算后得到的值传入服务端使用

你可能感兴趣的:(Java技术进阶)