í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