Verificação de assinatura da interface API

índice

1. Por que a assinatura da interface API é necessária?

2. Mecanismo de implementação de verificação de assinatura de interface API


1. Por que a assinatura da interface API é necessária?

       As interfaces de API abertas para o mundo externo enfrentarão alguns problemas de segurança, como o risco de ataques de mascaramento, ataques de violação, ataques de repetição e vazamento de informações de dados. O uso de assinaturas de interface de API pode facilmente evitar esses riscos e problemas de segurança. Os seguintes pontos devem ser considerados ao projetar assinaturas de interface de API:

  • Certifique-se de que os dados solicitados estão corretos

       Quando o valor de um determinado campo na solicitação muda, o resultado da assinatura original também muda. Portanto, enquanto os parâmetros mudam, a assinatura deve mudar, caso contrário, a solicitação será uma solicitação inválida.

  • Certifique-se de que a fonte da solicitação é legítima

       Geralmente, o algoritmo que gera a assinatura terá um appKey e um appSecret em pares, e a identidade do chamador pode ser identificada com base no appKey; e se a assinatura é legal, pode ser identificada com base no appSecret.

  • Identifique a oportunidade da interface

       Em circunstâncias normais, a assinatura e os parâmetros conterão um timestamp, para que o servidor possa verificar se a solicitação do cliente está dentro do tempo válido, evitando assim chamadas repetidas para a interface por muito tempo.

2. Mecanismo de implementação de verificação de assinatura de interface API

  • Fluxograma de verificação de assinatura

1 O cliente se aplica ao servidor para appKey e appSecret, e o servidor emite appKey e appSecret.

2 O cliente integra o SDK para gerar um sinal e envia o appKey, parâmetros de solicitação, carimbo de data / hora e sinal para o servidor. O servidor usa as regras de assinatura no SDK para gerar uma assinatura de acordo com os parâmetros de solicitação para verificar a validade de o sinal e retorna o 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 referência: https://help.aliyun.com/document_detail/101343.html?spm=a2c4g.11186623.6.574.6fa75ffal5uEms

Acho que você gosta

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