add sortJoin

This commit is contained in:
Looly
2019-10-29 14:45:25 +08:00
parent da39e9e646
commit 3511952a35
5 changed files with 124 additions and 67 deletions

View File

@@ -24,6 +24,7 @@ import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
@@ -825,13 +826,14 @@ public final class SecureUtil {
* 参数签名为对Map参数按照key的顺序排序后拼接为字符串然后根据提供的签名算法生成签名字符串<br>
* 拼接后的字符串键值对之间无符号键值对之间无符号忽略null值
*
* @param crypto 对称加密算法
* @param params 参数
* @param crypto 对称加密算法
* @param params 参数
* @param otherParams 其它附加参数字符串(例如密钥)
* @return 签名
* @since 4.0.1
*/
public static String signParams(SymmetricCrypto crypto, Map<?, ?> params) {
return signParams(crypto, params, StrUtil.EMPTY, StrUtil.EMPTY, true);
public static String signParams(SymmetricCrypto crypto, Map<?, ?> params, String... otherParams) {
return signParams(crypto, params, StrUtil.EMPTY, StrUtil.EMPTY, true, otherParams);
}
/**
@@ -843,15 +845,13 @@ public final class SecureUtil {
* @param separator entry之间的连接符
* @param keyValueSeparator kv之间的连接符
* @param isIgnoreNull 是否忽略null的键和值
* @param otherParams 其它附加参数字符串(例如密钥)
* @return 签名
* @since 4.0.1
*/
public static String signParams(SymmetricCrypto crypto, Map<?, ?> params, String separator, String keyValueSeparator, boolean isIgnoreNull) {
if (MapUtil.isEmpty(params)) {
return null;
}
String paramsStr = MapUtil.join(MapUtil.sort(params), separator, keyValueSeparator, isIgnoreNull);
return crypto.encryptHex(paramsStr);
public static String signParams(SymmetricCrypto crypto, Map<?, ?> params, String separator,
String keyValueSeparator, boolean isIgnoreNull, String... otherParams) {
return crypto.encryptHex(MapUtil.sortJoin(params, separator, keyValueSeparator, isIgnoreNull, otherParams));
}
/**
@@ -859,12 +859,13 @@ public final class SecureUtil {
* 参数签名为对Map参数按照key的顺序排序后拼接为字符串然后根据提供的签名算法生成签名字符串<br>
* 拼接后的字符串键值对之间无符号键值对之间无符号忽略null值
*
* @param params 参数
* @param params 参数
* @param otherParams 其它附加参数字符串(例如密钥)
* @return 签名
* @since 4.0.1
*/
public static String signParamsMd5(Map<?, ?> params) {
return signParams(DigestAlgorithm.MD5, params);
public static String signParamsMd5(Map<?, ?> params, String... otherParams) {
return signParams(DigestAlgorithm.MD5, params, otherParams);
}
/**
@@ -872,12 +873,13 @@ public final class SecureUtil {
* 参数签名为对Map参数按照key的顺序排序后拼接为字符串然后根据提供的签名算法生成签名字符串<br>
* 拼接后的字符串键值对之间无符号键值对之间无符号忽略null值
*
* @param params 参数
* @param params 参数
* @param otherParams 其它附加参数字符串(例如密钥)
* @return 签名
* @since 4.0.8
*/
public static String signParamsSha1(Map<?, ?> params) {
return signParams(DigestAlgorithm.SHA1, params);
public static String signParamsSha1(Map<?, ?> params, String... otherParams) {
return signParams(DigestAlgorithm.SHA1, params, otherParams);
}
/**
@@ -885,12 +887,13 @@ public final class SecureUtil {
* 参数签名为对Map参数按照key的顺序排序后拼接为字符串然后根据提供的签名算法生成签名字符串<br>
* 拼接后的字符串键值对之间无符号键值对之间无符号忽略null值
*
* @param params 参数
* @param params 参数
* @param otherParams 其它附加参数字符串(例如密钥)
* @return 签名
* @since 4.0.1
*/
public static String signParamsSha256(Map<?, ?> params) {
return signParams(DigestAlgorithm.SHA256, params);
public static String signParamsSha256(Map<?, ?> params, String... otherParams) {
return signParams(DigestAlgorithm.SHA256, params, otherParams);
}
/**
@@ -900,11 +903,12 @@ public final class SecureUtil {
*
* @param digestAlgorithm 摘要算法
* @param params 参数
* @param otherParams 其它附加参数字符串(例如密钥)
* @return 签名
* @since 4.0.1
*/
public static String signParams(DigestAlgorithm digestAlgorithm, Map<?, ?> params) {
return signParams(digestAlgorithm, params, StrUtil.EMPTY, StrUtil.EMPTY, true);
public static String signParams(DigestAlgorithm digestAlgorithm, Map<?, ?> params, String... otherParams) {
return signParams(digestAlgorithm, params, StrUtil.EMPTY, StrUtil.EMPTY, true, otherParams);
}
/**
@@ -916,15 +920,13 @@ public final class SecureUtil {
* @param separator entry之间的连接符
* @param keyValueSeparator kv之间的连接符
* @param isIgnoreNull 是否忽略null的键和值
* @param otherParams 其它附加参数字符串(例如密钥)
* @return 签名
* @since 4.0.1
*/
public static String signParams(DigestAlgorithm digestAlgorithm, Map<?, ?> params, String separator, String keyValueSeparator, boolean isIgnoreNull) {
if (MapUtil.isEmpty(params)) {
return null;
}
final String paramsStr = MapUtil.join(MapUtil.sort(params), separator, keyValueSeparator, isIgnoreNull);
return new Digester(digestAlgorithm).digestHex(paramsStr);
public static String signParams(DigestAlgorithm digestAlgorithm, Map<?, ?> params, String separator,
String keyValueSeparator, boolean isIgnoreNull, String... otherParams) {
return new Digester(digestAlgorithm).digestHex(MapUtil.sortJoin(params, separator, keyValueSeparator, isIgnoreNull, otherParams));
}
// ------------------------------------------------------------------- UUID

View File

@@ -1,5 +1,6 @@
package cn.hutool.crypto.test;
import cn.hutool.core.map.MapUtil;
import org.junit.Assert;
import org.junit.Test;
@@ -8,6 +9,9 @@ import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.Sign;
import cn.hutool.crypto.asymmetric.SignAlgorithm;
import java.util.HashMap;
import java.util.Map;
/**
* 签名单元测试
*
@@ -88,4 +92,18 @@ public class SignTest {
boolean verify = sign.verify(data, signed);
Assert.assertTrue(verify);
}
@Test
public void signParamsTest(){
Map<String, String> build = MapUtil.builder(new HashMap<String, String>())
.put("key1", "value1")
.put("key2", "value2").build();
String sign1 = SecureUtil.signParamsSha1(build);
Assert.assertEquals("9ed30bfe2efbc7038a824b6c55c24a11bfc0dce5", sign1);
String sign2 = SecureUtil.signParamsSha1(build, "12345678");
Assert.assertEquals("944b68d94c952ec178c4caf16b9416b6661f7720", sign2);
String sign3 = SecureUtil.signParamsSha1(build, "12345678", "abc");
Assert.assertEquals("edee1b477af1b96ebd20fdf08d818f352928d25d", sign3);
}
}