Verificación de la firma de la interfaz API

Tabla de contenido

1. ¿Por qué se requiere la firma de la interfaz API?

2. Mecanismo de implementación de la verificación de la firma de la interfaz API


1. ¿Por qué se requiere la firma de la interfaz API?

       Las interfaces API que están abiertas al mundo exterior enfrentarán algunos problemas de seguridad, como el riesgo de ataques enmascarados, ataques de manipulación, ataques de reproducción y fuga de información de datos. El uso de firmas de interfaz API puede prevenir fácilmente estos problemas y riesgos de seguridad. Se deben tener en cuenta los siguientes puntos al diseñar firmas de interfaz API:

  • Asegúrese de que los datos solicitados sean correctos

       Cuando cambia el valor de un determinado campo en la solicitud, el resultado de la firma original cambiará. Por lo tanto, mientras cambien los parámetros, la firma debe cambiar, de lo contrario la solicitud será una solicitud inválida.

  • Asegúrese de que la fuente de la solicitud sea legítima

       Generalmente, el algoritmo que genera la firma tendrá una appKey y una appSecret en pares, y la identidad de la persona que llama se puede identificar en función de la appKey; y si la firma es legal puede identificarse en función de la appSecret.

  • Identificar la puntualidad de la interfaz.

       En circunstancias normales, la firma y los parámetros contendrán una marca de tiempo, de modo que el servidor pueda verificar si la solicitud del cliente está dentro del tiempo válido, evitando así llamadas repetidas a la interfaz durante mucho tiempo.

2. Mecanismo de implementación de la verificación de la firma de la interfaz API

  • Diagrama de flujo de verificación de firma

1 El cliente solicita al servidor appKey y appSecret, y el servidor emite appKey y appSecret.

2 El cliente integra el SDK para generar una señal y envía la clave de la aplicación, los parámetros de solicitud, la marca de tiempo y la firma al servidor. El servidor utiliza las reglas de firma en el SDK para generar una firma de acuerdo con los parámetros de solicitud para verificar la validez de el signo y luego devuelve el resultado.

  • Código
//签名
public static Map<String, String> generateSign(String appKey, String appSecret, String url, String method) throws NoSuchAlgorithmException, InvalidKeyException {
        Map<String, String> headers = new HashMap<String, String>();
        SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT_STRING);
        df.setTimeZone(new SimpleTimeZone(0, TIME_ZONE));
        String timestamp = df.format(new Date());
        StringBuilder stringToSign = new StringBuilder();
        stringToSign.append(method.toUpperCase()).append(url).append(timestamp);
        String signature = sign(appSecret, stringToSign.toString());
        headers.put("signature", signature);
        headers.put("appKey", appKey);
        headers.put("timestamp", timestamp);
        return headers;
    }

//验证签名
public static String validateSign(String appSecret, String url, String method, String timestamp) throws NoSuchAlgorithmException, InvalidKeyException {
        StringBuilder stringToSign = new StringBuilder();
        stringToSign.append(method.toUpperCase()).append(url).append(timestamp);
        return sign(appSecret, stringToSign.toString());
    }

//签名和验签公用方法
private static String sign(String appSecret, String stringToSign)
            throws InvalidKeyException, NoSuchAlgorithmException {
        SecretKeySpec signingKey = new SecretKeySpec(appSecret.getBytes(CHARSET), "HmacSHA1");
        Mac mac = Mac.getInstance(ALGORITHM_HMAC_SHA1);
        mac.init(signingKey);
        byte[] data = mac.doFinal(stringToSign.getBytes(CHARSET));
        return Base64.getEncoder().encodeToString(data);
    }

Documento de referencia: https://help.aliyun.com/document_detail/101343.html?spm=a2c4g.11186623.6.574.6fa75ffal5uEms

Supongo que te gusta

Origin blog.csdn.net/jack1liu/article/details/93379328
Recomendado
Clasificación