Maison >interface Web >js tutoriel >Quelles vulnérabilités de sécurité existent lors de l'utilisation d'une attaque temporelle dans les applications de nœuds ?

Quelles vulnérabilités de sécurité existent lors de l'utilisation d'une attaque temporelle dans les applications de nœuds ?

亚连
亚连original
2018-06-02 17:09:581829parcourir

Cet article analyse la vulnérabilité de sécurité des attaques temporelles des applications de nœuds sur la base des principes. Les amis intéressés peuvent le lire pour référence.

Avant-propos

Si vous avez rencontré une erreur eslint Potentielle attaque de timing dans votre projet, ne l'ignorez pas ! Il s’agit d’un problème de sécurité : le timing des attaques.
Cause du rapport d'erreur eslint

Tout d'abord, eslint introduit un plug-in appelé eslint-plugin-security. Ce plug-in aide à identifier les problèmes de sécurité potentiels, mais il peut également provoquer des faux positifs. Adresse du code source du plug-in.

var keywords = '((' + [
  'password',
  'secret',
  'api',
  'apiKey',
  'token',
  'auth',
  'pass',
  'hash'
 ].join(')|(') + '))';

 var re = new RegExp('^' + keywords + '$', 'im');

 function containsKeyword (node) {
  if (node.type === 'Identifier') {
   if (re.test(node.name)) return true;
  }
  return
 }
 if (node.test.operator === '==' || node.test.operator === '===' || node.test.operator === '!=' || node.test.operator === '!==') {
  // 在这里 console 出错误
 }

Tout d'abord, ce plug-in déterminera si l'opérateur cette fois est ==, ===, ! =,! ==L'un d'eux, vérifiez deuxièmement si l'identifiant (nom du champ) contient la chaîne spéciale password, secret, api, apiKey, token, auth, pass, hash. Si les deux conditions sont remplies en même temps, eslint compilera et rapportera. une erreur Attaque temporelle potentielle .

Définition de l'attaque

attaque temporelle : attaque temporelle, qui appartient à l'attaque par canal secondaire/attaque par canal secondaire fait référence à l'utilisation d'informations en dehors du canal, Comme le cryptage et le déchiffrement, la méthode d'attaque est basée sur les données, le temps de comparaison des données, le trafic de transmission de texte chiffré et les canaux, ce qui équivaut à « faire des insinuations ».

Point d'attaque

Parlons d'abord du principe de js comparant la taille de deux chaînes :

  • Déterminer si la longueur de la chaîne est 0. Si elle est 0, le résultat peut être directement comparé sinon, passez à la deuxième étape ;

  • Les chaînes sont composées de caractères et sont comparées par le charCode de chaque caractère.

  • Dans la deuxième étape, tant qu'un caractère est différent, renvoyez false et les caractères restants ne seront pas comparés.

La comparaison de caractères uniques est très rapide. L'attaquant peut affiner la précision du temps de mesure à la microseconde et déduire quel caractère n'est pas utilisé de la différence de temps de réponse. encore et encore ou en écrivant un script en Python à exécuter, vous pouvez essayer le mot de passe correct, et la difficulté de déchiffrage du mot de passe est également considérablement réduite.

Écriture vulnérable

if (user.password === password) {
  return { state: true }; // 登录成功
 }

Mesures défensives

Chaque entrée différente entraînera un temps de traitement différent. Pour éviter cela, nous devons faire en sorte que la comparaison de chaînes prenne le même temps quel que soit le mot de passe saisi.
Écriture non vulnérable aux attaques

La longueur de chaque mot de passe dans le système est fixe Chaque fois que vous comparez si le mot de passe est le même, utilisez la longueur du mot de passe correct comme nombre de comparaisons. , et utilisez XOR pour comparer chaque caractère. Vérifiez si les encodages Unicode sont égaux, stockez chaque résultat de comparaison dans un tableau, et enfin déterminez si chaque élément du tableau est 0 (0 signifie que les deux caractères sont identiques).

 // psdReceived 为用户输入密码;
 // psdDb 为系统中存储的正确用户密码
 const correctUser = (psdDb, psdReceived) => {
  const state = [];
  for (let i = 0; i < psdDb.length; ++i) {
   if (!psdReceived[i]) {
    state.push(false);
   } else {
    state.push(psdReceived.charCodeAt(i) ^ psdDb.charCodeAt(i));
   }
  }
  return state.length !== 0 && state.every(item => !item);
 }

Recommandation de package tiers

Vous pouvez également utiliser les cryptiles du module npm pour résoudre ce problème

import cryptiles from &#39;cryptiles&#39;;

......
return cryptiles.fixedTimeCimparison(passwordFromDb, passwordReceived);

Ce qui précède est ce que j'ai compilé pour tout le monde. J'espère que cela sera utile à l'avenir.

Articles connexes :

Principes de partage des ressources du processus parent et du processus enfant NodeJS et méthodes de mise en œuvre

Téléchargement d'images et de fichiers dans vue Exemple de code

Instance de soumission du formulaire vue axios pour télécharger des images

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn