De plus en plus de projets utilisent désormais le modèle de séparation front-end et back-end pour le développement. Les développeurs back-end utilisent des interfaces API pour transférer des données aux développeurs front-end à des fins de traitement et d'affichage. Dans certaines modifications plus importantes des interfaces de données, impliquant de l'argent, des informations utilisateur, etc., si les interfaces ne sont pas protégées et vérifiées, il est souvent facile pour quelqu'un de glisser l'interface de manière malveillante, ce qui entraîne d'énormes pertes.
Nous introduisons ici une vérification de signature plus courante dans l'industrie pour crypter les paramètres de l'interface, qui présente les avantages suivants.
Unicité demandée : La signature calculée est unique et peut être utilisée à des fins de vérification.
Variabilité du paramètre : Le paramètre contient le paramètre timestamp, qui garantit que la signature calculée pour chaque requête est différente.
Actualité de la requête : Puisque la requête contient le paramètre d'horodatage de la requête en cours, le serveur peut vérifier l'horodatage et filtrer les requêtes qui dépassent l'actualité.
Sécurité : Même si la requête est capturée de manière malveillante et que les paramètres sont falsifiés de manière malveillante, la signature sera erronée et les paramètres ne pourront pas être modifiés.
1 Trier les données à signer de type carte (c'est-à-dire un ensemble de paires clé-valeur) en fonction de la taille de. la clé. Les paramètres de la carte sont triés par ordre alphabétique. Si les premières lettres sont identiques, ils sont triés par la deuxième lettre, et ainsi de suite. Par exemple,
{ "timestamp": "2017-06-08 09:38:00", "format": "xml", "app_id": "aabbc", "cp_extend_info": "", "sign_type": "HMAC-SHA1", "sign": "abc" }
puis, après tri, cela devient
{ "app_id": "aabbc", "cp_extend_info": "", "format": "xml", "sign_type": "HMAC-SHA1", "timestamp": "2017-06-08 09:38:00" }
Remarque :Si la carte contient un paramètre de signature (signe), la valeur clé de le paramètre doit être filtré. Participez à la signature. Veuillez ne pas participer à la signature des paramètres sans valeurs
2 Sérialisez la carte triée dans une chaîne à signer. être signé est
app_id=aabbc&format=xml&sign_type=HMAC-SHA1×tamp=2017-06-08 09:38:00
3. Utilisez la clé pour extraire la signature digest (hachage) de la chaîne à signer selon l'algorithme HMAC-SHA1 et encodez-la en base64 (pour faciliter la transmission et la comparaison explicites en supposant que). la clé de signature est test, la signature digest extraite est La valeur de base64_encode est
JqoEqPIVVor0eyRHMYiZftsycVo=
Remarque :Étant donné que certaines données sont requises par le protocole HTTP, l'encodage d'URL doit être effectué pendant transmission réseau afin que le récepteur puisse recevoir les paramètres corrects. Mais si ce paramètre participe à la signature, alors la chaîne à signer doit être la valeur originale de la chaîne plutôt que la valeur de l'URLencoding.
Exemple PHP
/** * 使用密钥生成HMAC-Sha1签名 * @param array $params 请求参数 * @param string $signKey 签名密钥 * @return string */ function hmacSha1Sign($params,$signKey) { ksort($params); $paramString = ''; foreach ($params as $key => $value) { if (is_null($value) || $value=='' || $key == 'sign') { continue; } $paramString .= $key.'='.$value.'&'; } $paramString = substr($paramString,0,-1); $sign = base64_encode(hash_hmac("sha1", $paramString, $signKey, $raw_output=TRUE)); return $sign; }
Ce qui précède est la méthode de signature de vérification API couramment utilisée dans le développement quotidien. C'est très simple. et très utile. Bienvenue à suivre pour plus de tutoriels.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!