Was sollten Webprogrammierer über Kryptografie wissen? [geschlossen]

27

Sollten Programmierer, die Websites / Webanwendungen erstellen, die Kryptografie verstehen? Ich habe keine Ahnung, wie die meisten kryptografischen Algorithmen funktionieren, und ich verstehe die Unterschiede zwischen md5 / des / aes / etc wirklich nicht. Hat jemand von Ihnen einen Bedarf für ein tiefgreifendes Verständnis der Kryptographie gefunden?

Ich habe es nicht gebraucht, aber ich frage mich, ob mir vielleicht etwas fehlt. Ich habe Salt + MD5-Hash verwendet, um Passwörter zu verschlüsseln, und ich fordere Webserver auf, SSL zu verwenden. Darüber hinaus kann ich nicht sagen, dass ich viel anderes verwendet habe, und ich kann auch nicht mit Sicherheit sagen, wie sicher diese Methoden sind. Ich benutze sie nur, weil andere Leute behaupten, sie seien sicher.

Haben Sie jemals eine Notwendigkeit gefunden, Kryptographie in der Webprogrammierung zu verwenden, abgesehen von diesen zwei einfachen Beispielen?

Davidhaskins
quelle
4
Sie sollten genug wissen, um zu wissen, dass sie es nicht tun sollten.
SLaks
@SLaks: +1 100% stimmen zu. Ich habe eine Antwort auf diesen Thread geschrieben, um zu erläutern, warum dies so ist.
Chris Jester-Young

Antworten:

41

Webprogrammierer sollten wissen, dass sie niemals selbst versuchen sollten, Kryptografie zu implementieren.

Dies bedeutet insbesondere, dass kein Nicht-Sicherheitsexperte eines der kryptografischen Grundelemente direkt berühren sollte. Sie sollten nicht auf der Ebene von AES, SHA-1 usw. denken. Stattdessen sollten sie übergeordnete Funktionen zum Verschlüsseln und Signieren von Nachrichten und zum "Hash" von Passwörtern verwenden.

Warum? Weil die Leute sonst in die Irre geführt werden und denken, dass:

  • AES-256 ist eine hervorragende Verschlüsselung, obwohl sie im EZB-Modus oder mit nicht zufälligen IV-Werten usw. verwendet wird. (In einigen Modi sind nicht zufällige, aber eindeutige IVs in Ordnung. In anderen nicht so viel.)
  • Sie können denselben symmetrischen Schlüssel zum Verschlüsseln mehrerer Nachrichten verwenden (oder den symmetrischen Schlüssel für die direkte Verwendung im Code speichern).
    • Sie können sich sogar dafür entscheiden, eine Passphrase direkt als Schlüssel zu verwenden, ohne Schlüsselableitungsfunktionen zu verwenden.
  • Sie können RSA verwenden, um Daten direkt zu verschlüsseln.
  • Sie können einfach ihre Passwörter "salzen und MD5", um sie sicher zu halten. (Wenn Sie denken, dass Regenbogentabellen das schwächste Glied sind, denken Sie noch einmal darüber nach .)

Nur um auf der gleichen Seite zu sein, ist keiner der oben genannten Punkte in Ordnung . Wenn Sie das nicht verstehen, sollten Sie Crypto nicht mit einer 10-Fuß-Stange berühren! (AES-256 ist eine großartige Verschlüsselung, aber nur, wenn Sie sie richtig verwenden. "Es kommt nicht auf die Größe an, sondern darauf, was Sie damit machen." :-))

Über welche übergeordneten Funktionen spreche ich? Ich persönlich empfehle die Verwendung einer OpenPGP-Bibliothek (für Daten in Ruhe) oder einer SSL-Bibliothek (für Daten in Bewegung). Diese Protokolle spezifizieren streng die korrekte Verwendung von asymmetrischen, symmetrischen und Hash-Algorithmen. Zum Beispiel mit OpenPGP:

  • RSA wird nicht zum direkten Verschlüsseln von Daten verwendet, sondern es wird ein zufälliger Sitzungsschlüssel (symmetrisch) pro Nachricht generiert (dies ist wichtig). RSA wird zum Verschlüsseln dieses Sitzungsschlüssels verwendet.
  • Es verwendet eine Schlüsselableitungsfunktion, um Passphrasen in Schlüssel umzuwandeln. (Im OpenPGP-Sprachgebrauch wird es als S2K bezeichnet, aber ich denke, "Schlüsselableitungsfunktion" ist der üblichere Begriff.)
  • Es übernimmt die Auswahl eines guten Modus, sodass Sie niemals die EZB verwenden werden.
  • Es übernimmt die Schlüsselverwaltung für Sie, sodass Sie keine Ad-hoc-Entscheidungen darüber treffen müssen, welche Schlüssel vertrauenswürdig sind usw.

Zusammenfassung: Wenn Sie kein Sicherheitsexperte sind und auf der Ebene von AES, SHA-1 oder (himmlisch verboten) MD5 denken, machen Sie es falsch . Verwenden Sie eine Bibliothek, die von Sicherheitsexperten (wie Bouncy Castle) geschrieben wurde und Protokolle implementiert, die von Sicherheitsexperten (wie OpenPGP für die Verschlüsselung oder bcrypt oder scrypt für das Kennwort-Hashing) entwickelt wurden, anstatt Ihre eigenen Protokolle zu erstellen.

Ich bin kein Krypto-Experte, aber ich weiß genug, um nicht zu versuchen, meine eigenen Ad-hoc-Protokolle zu entwerfen. Um es klar zu machen: Dieser gesamte Beitrag ist aus Cryptography 101-Material . Wenn dieser Beitrag für Sie also keinen 100% igen Sinn ergibt, sollten Sie auf keinen Fall in die Nähe der Kryptografie gelangen.

Chris Jester-Young
quelle
4
genial. Liebte den Blog-Beitrag, der mit "think again" verlinkt ist. chargen.matasano.com/chargen/2007/9/7/…
davidhaskins
+1, aber es ist in Ordnung, denselben symmetrischen Schlüssel mehrmals zu verwenden. Dafür ist die Infusion gedacht (sonst würdest du sie nicht brauchen).
Orip
1
Darüber hinaus hat Colin Percival von scrypt (and other) fame einen großartigen Artikel mit dem Titel "Cryptographic Right Answers" veröffentlicht, in dem die für Sie wichtigen Entscheidungen zu Krypto-Bread-and-Butter-Verfahren aufgeführt sind. SSL ist sehr problematisch (die Sperrung von Schlüsseln ist sehr schwer zu implementieren). Mehr Infos hier: daemonology.net/blog/…
orip
@orip Zustimmen, obwohl ich sagen würde, dass die Verwendung desselben Schlüssels mit einer anderen IV in der Regel für den Fall sinnvoller ist, dass Ihre Nachricht länger ist als die Blockgröße der ausgewählten symmetrischen Chiffre, und nicht für bestimmte Nachrichten, für die Sie keine haben Kontext zum Verfolgen von IVs, die für vorherige Nachrichten verwendet wurden. Stimmen Sie auch dem Artikel von Colin Percival zu.
Chris Jester-Young
1
@ Happy Ich habe den Link zu etwas geändert, das relevanter ist.
Chris Jester-Young
14

Sie müssen nichts anderes als die Grundlagen der Kryptografie kennen (was ist ein Hash, was ist ein Salt, ungefähr wie schwer es ist, diese oder jene Verschlüsselung zu knacken usw.), aber Sie müssen einiges über Sicherheit in wissen Allgemeines.

Die wichtigsten Sicherheitsbereiche, die Sie als Webentwickler unbedingt beachten müssen:

  1. SQL-Injektion. Dies ist wahrscheinlich die gefährlichste Lücke, die ein Webentwickler in einem System schlagen kann.
  2. Cross-Site-Scripting und Cookies.
  3. Spambots und Captchas.
  4. SQL-Injektion. Es kann nicht genug betont werden, wie wichtig dies ist.
biziclop
quelle
Es ist sehr gefährlich, nicht zu verstehen, was Sie tun. Wenn Sie nicht wissen, was der Unterschied zwischen einem Message Digest-Hash und einem kryptografischen Hash ist, kann dies Sie ruinieren. Nicht zu wissen, wie man salzt, kann dich ruinieren.
Inkognito
@ user1525 Das habe ich als die Grundlagen der Kryptographie verstanden. Sie müssen definitiv nicht wissen, wie einer der Verschlüsselungsalgorithmen tatsächlich funktioniert.
biziclop
Ich weiß die Reaktion zu schätzen und bin mit SQL-Injection und anderen Angriffen einverstanden, aber ich habe wirklich nach Kryptografie gefragt.
Davidhaskins
2
@davidhaskins Ja, ich dachte nur, es lohnt sich darauf hinzuweisen, weil jedes Level auf dem vorherigen aufbaut. Zu wissen, wie AES funktioniert, ist nichts wert, wenn Sie Ihre Anwendung nicht auf einer grundlegenderen Ebene sichern können. Nach meiner Erfahrung ist dies eine Falle, in die viele Entwickler geraten (ich habe es mehrmals getan), um mich auf die Verschlüsselung zu konzentrieren und ihre Rolle in der langen Sicherheitskette aus den Augen zu verlieren.
biziclop
4

Ich erinnere mich, dass ich diesen Vortrag mit dem Titel Was jeder Ingenieur über Sicherheit wissen muss und wo man es lernen kann gesehen habe. Der Sprecher ist Neil Daswani und es ist ein Google Tech Talk, den er gehalten hat.

Gilt jedoch nicht nur für Webprogrammierer. Vielleicht sollte die Frage mit dem Titel "Was sollten Programmierer über Sicherheit wissen?" Umbenannt werden. da sie nicht mehr als die Grundlagen der Kryptographie wissen müssen (so interessant es auch ist)


quelle
2

Crypto ist in vielen Situationen nützlich. Ein Beispiel, das wir verwendet haben, ist das Verschlüsseln eines Sitzungscookies, das von einem Win / IIS-Host erstellt und für die Verwendung auf einem LAMP-Host festgelegt wurde.

Wenn Sie eine Verschlüsselung implementieren möchten (im Gegensatz zu md5 / sha1-Hashing), sind einige grundlegende Begriffe wichtig - beispielsweise der Unterschied zwischen symmetrischer und asymmetrischer Verschlüsselung. Zusammen mit dem Verständnis des Unterschieds zwischen den beiden sollten Sie ein Verständnis dafür entwickeln, was Sie als Webentwickler tun müssen, um Entschlüsselungsschlüssel ordnungsgemäß zu speichern und zu sichern. Beispiel: Wenn Sie eine Anwendung entwickeln, die auf einem Host bereitgestellt werden soll, auf dem Sie keine vollständige administrative Kontrolle haben, z. B. auf einem freigegebenen Host, oder auf einem Server, auf dem alle Administratoren bekannt und vertrauenswürdig sind.

Michael
quelle
2

Meiner Meinung nach sollten Sie alles über Kryptografie wissen, was jemand wissen wird, der Ihren Code angreift. Sie sollten Hashes, Salt, die Nicht-Zufälligkeit des Zufalls, die wichtigsten Verschlüsselungsalgorithmen (RSA, 3DES, AES usw.) und SHA-1 / MD-5 / et al. Verstehen. Sie müssen sie nicht auswendig lernen, aber Sie sollten zumindest wissen, wie effektiv ein Hash-Algorithmus ist und wie er gestärkt werden kann. Sie sollten wissen, was Kollisionen und Fehlalarme sind. Sie sollten nicht in der Lage sein, die Verschlüsselungsalgorithmen zu rezitieren, aber Sie sollten mit deren Benchmarks vertraut sein, welche für welche Szenarien ideal sind. Sie sollten in der Lage sein, symmetrische und asymmetrische Verschlüsselung zu beschreiben und zu erläutern, wann sie verwendet werden sollen. Sie sollten wissen, was PKI ist und wie sie verwendet wird. Sie sollten wissen, was eine Zertifizierungsstelle ist und wie sie mit Ihren Servern interagiert.

Es ist nicht so wichtig, alles genau zu kennen, wie den Hintergrund zu kennen. Was sind die Benchmarks für bestimmte Dinge (wie schnell, wie stark, wie schwach usw.)?

Diese Empfehlungen gelten für Informationen auf Senior- oder Architektenebene. Wenn Sie nur ein Netzaffe sind, der ein Ruder rudert, müssen Sie nichts davon wissen. Ihr Architekt sollte dieses Zeug kennen. Wenn Sie für die Site verantwortlich sind, sie entwerfen, implementieren usw., sollten Sie mit all diesen Konzepten vertraut sein und in der Lage sein, sich auf intelligente Weise darüber auszutauschen. Sie müssen nicht in der Lage sein, es zu lehren, sondern nur Informationen darüber zu akzeptieren und zu verbreiten.

Joel Etherton
quelle
2

Sie sollten bcrypt (Blowfish) verwenden, um Kennwörter anstelle von MD5 zu speichern. Es ist ein viel langsamerer Algorithmus , was bedeutet, dass es für einen Hacker viel schwieriger ist, zu erraten und zu überprüfen. Außerdem nimmt bcrypt einen Arbeitsfaktor als Parameter, was bedeutet, dass er mit der Einführung neuer Computer noch langsamer werden kann, sodass er zukunftssicher ist.

Weitere Informationen finden Sie unter So speichern Sie ein Kennwort sicher .

Chrisaycock
quelle
0

Als eine ziemlich allgemeine Antwort auf diese Art von Fragen denke ich immer, dass Sie versuchen sollten, ein grundlegendes Verständnis von allem zu haben, das in einem entfernten Zusammenhang mit dem steht, was Sie tun. Natürlich benötigen Sie genaue Kenntnisse darüber, woran Sie gerade arbeiten. Es ist sehr schwer vorherzusagen, wie sich ein bestimmtes Gebiet entwickeln wird, was "in Mode" sein wird oder was Sie in Zukunft brauchen werden, so dass ein breites Gebiet an Dingen, von denen Sie zumindest "gehört" haben, erhalten bleibt Viele Türen öffnen sich.

Nach meiner persönlichen Erfahrung in der Webprogrammierung fand ich grundlegende Begriffe der asymetrischen Kryptographie und solche, die hilfreich waren, um zu verstehen, was unter der Haube vor sich geht. Ich hätte ohne sie überleben können, aber ich muss sagen, ich mag Kryptographie und Mathematik, warum nicht.

Omar Kohl
quelle