java编写接口需要进线验签,保证接口的安全性,请问怎么搞?

提问者:帅平 问题分类:微服务
java编写接口需要进线验签,保证接口的安全性,请问怎么搞?
2 个回答
国民小哥哥
国民小哥哥
一般的做法是根据传递的参数进线排序,然后拼接上秘钥生成MD5签名进线比对sign即可,示例代码如下:
1、把参数进行排序生成签名
// 生成签名  
    public static String generateSignature(Map<String, String> params, String secretKey) throws NoSuchAlgorithmException {  
        // 按字母顺序排序参数  
        Map<String, String> sortedParams = new HashMap<>(params);  
        sortedParams.entrySet().stream()  
                .sorted(Map.Entry.comparingByKey())  
                .forEachOrdered(entry -> sortedParams.put(entry.getKey(), entry.getValue()));  
  
        // 拼接参数和密钥  
        StringBuilder sb = new StringBuilder();  
        sortedParams.forEach((key, value) -> sb.append(key).append("=").append(value).append("&"));  
        sb.append("key=").append(secretKey);  
  
        // 生成MD5签名  
        MessageDigest md = MessageDigest.getInstance("MD5");  
        byte[] digest = md.digest(sb.toString().getBytes());  
        return bytesToHex(digest);  
    }
发布于:1个月前 (03-21) IP属地:四川省
空欢喜一场
空欢喜一场
2、字节数组需要转换成16进制
// 辅助方法:将字节数组转换为十六进制字符串  
    private static String bytesToHex(byte[] bytes) {  
        StringBuilder sb = new StringBuilder();  
        for (byte b : bytes) {  
            sb.append(String.format("%02x", b));  
        }  
        return sb.toString();  
    }
3、验证签名:
// 验证签名  
    public static boolean verifySignature(Map<String, String> params, String receivedSignature, String secretKey) throws NoSuchAlgorithmException {  
        String generatedSignature = generateSignature(params, secretKey);  
        return generatedSignature.equals(receivedSignature);  
    }
发布于:1个月前 (03-21) IP属地:四川省
我来回答