Heim > Web-Frontend > js-Tutorial > Welche Sicherheitslücken bestehen bei der Verwendung von Timing-Attack in Knotenanwendungen?

Welche Sicherheitslücken bestehen bei der Verwendung von Timing-Attack in Knotenanwendungen?

亚连
Freigeben: 2018-06-02 17:09:58
Original
1820 Leute haben es durchsucht

Dieser Artikel analysiert die Sicherheitslücke bei Timing-Angriffen von Knotenanwendungen anhand der Prinzipien. Interessierte Freunde können ihn als Referenz lesen.

Vorwort

Wenn Sie auf einen Eslint-Fehler gestoßen sind. Möglicher Timing-Angriff in Ihrem Projekt, ignorieren Sie ihn nicht! Dies ist ein Sicherheitsproblem: Timing-Angriffe.
Ursache des eslint-Fehlerberichts

Zunächst führt eslint ein Plug-in namens eslint-plugin-security ein. Dieses Plug-in hilft bei der Identifizierung potenzieller Sicherheitsprobleme, kann aber auch zu Fehlalarmen führen Adresse des Plug-in-Quellcodes.

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 出错误
 }
Nach dem Login kopieren

Zunächst ermittelt dieses Plug-in, ob der Operator dieses Mal ==, ===,! ist. =,! ==Eine davon: Überprüfen Sie zweitens, ob der Bezeichner (Feldname) die spezielle Zeichenfolge „Passwort“, „Geheimnis“, „API“, „APIKey“, „Token“, „Authentifizierung“, „Pass“ und „Hash“ enthält. Wenn beide Bedingungen gleichzeitig erfüllt sind, wird eslint kompilieren und melden ein Fehler Möglicher Timing-Angriff.

Angriffsdefinition

Timing-Angriff: Timing-Angriff, der zum Seitenkanalangriff/Seitenkanalangriff gehört, bezieht sich auf die Verwendung von Informationen außerhalb des Kanals. Die Angriffsmethode basiert auf den Daten, der Datenvergleichszeit, dem Chiffretext-Übertragungsverkehr und den Kanälen, was einer „Anspielung“ entspricht.

Angriffspunkt

Lassen Sie uns zunächst über das Prinzip von js sprechen, indem wir die Größe zweier Zeichenfolgen vergleichen:

  • Bestimmen Sie, ob Die Zeichenfolgenlänge beträgt 0. Wenn sie 0 ist, kann das Ergebnis direkt verglichen werden. Andernfalls fahren Sie mit dem zweiten Schritt fort.

  • Strings bestehen aus Zeichen und werden anhand des charCodes jedes Zeichens verglichen.

  • Solange im zweiten Schritt ein Zeichen unterschiedlich ist, wird „false“ zurückgegeben und die übrigen Zeichen werden nicht verglichen.

Der Vergleich einzelner Zeichen erfolgt sehr schnell auf Mikrosekunden genau und kann auf diese Weise durch Experimentieren ableiten, welches Zeichen nicht verwendet wird Wenn Sie immer wieder ein Skript in Python schreiben oder es ausführen, können Sie das richtige Passwort ausprobieren und die Schwierigkeit beim Knacken von Passwörtern wird ebenfalls erheblich verringert.

Vulnerable Writing

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

Abwehrmaßnahmen

Jede unterschiedliche Eingabe führt dazu, dass die Verarbeitungszeit unterschiedlich ist. Um dies zu verhindern, müssen wir dafür sorgen, dass der Zeichenfolgenvergleich unabhängig vom eingegebenen Passwort gleich lange dauert.
Schreiben, das nicht anfällig für Angriffe ist

Die Länge jedes Passworts im System ist festgelegt. Verwenden Sie bei jedem Vergleich, ob das Passwort gleich ist, die Länge des richtigen Passworts als Anzahl der Vergleiche , und verwenden Sie XOR, um jedes Zeichen zu vergleichen. Überprüfen Sie, ob die Unicode-Codierungen gleich sind, speichern Sie jedes Vergleichsergebnis in einem Array und bestimmen Sie schließlich, ob jedes Element des Arrays 0 ist (0 bedeutet, dass die beiden Zeichen gleich sind).

 // 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);
 }
Nach dem Login kopieren

Drei-Parteien-Paketempfehlung

Sie können dieses Problem auch mit den npm-Modul-Cryptiles lösen

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

......
return cryptiles.fixedTimeCimparison(passwordFromDb, passwordReceived);
Nach dem Login kopieren

Das Obige ist das, was ich für alle zusammengestellt habe in Zukunft für alle hilfreich sein.

Verwandte Artikel:

Grundsätze und Implementierungsmethoden für die gemeinsame Nutzung von Ressourcen für den übergeordneten und untergeordneten Prozess von NodeJS

Bild- und Datei-Upload in Vue Beispielcode

Instanz der Vue-Axios-Formularübermittlung zum Hochladen von Bildern

Das obige ist der detaillierte Inhalt vonWelche Sicherheitslücken bestehen bei der Verwendung von Timing-Attack in Knotenanwendungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage