Frage

Auf einer Form meines Web-app habe ich ein verstecktes Feld bekommt, dass ich vor Manipulationen aus Sicherheitsgründen schützen muß. Ich versuche, mit einer Lösung zu kommen, wobei ich, wenn der Wert des verborgenen Feldes geändert wurde erkennen kann, und entsprechend reagieren (das heißt mit einem generischen „Etwas schief gelaufen ist, bitte versuchen Sie es erneut“ Fehlermeldung). Die Lösung sollte sicher genug sein, dass Brute-Force-Angriffe nicht durchführbar sind. Ich habe eine grundlegende Lösung bekam, dass ich arbeiten denken, aber ich bin nicht der Sicherheitsexperte und ich total sein kann hier etwas fehlt.

Meine Idee ist, zwei versteckte Eingänge zu machen: ein mit dem Namen „important_value“, mit dem Wert, den ich schützen müssen, und ein mit dem Namen „important_value_hash“ mit dem SHA-Hash des wichtigen Wertes mit einer konstanten verketteten langen zufälliger Zeichenfolge (dh der gleiche Zeichenfolge wird jedes Mal verwendet werden). Wenn das Formular übermittelt wird, wird der Server den SHA-Hash erneut berechnen und vergleichen, gegen den übermittelten Wert von important_value_hash. Wenn sie nicht gleich sind, hat sich die important_value manipuliert wurde.

Ich könnte auch verketten zusätzliche Werte mit der Eingabezeichenfolge des SHA (vielleicht den IP-Adresse des Benutzers?), Aber ich weiß nicht, ob das wirklich gewinnt mir nichts.

Wird dies sicher sein? Wer noch keine Einsicht darüber, wie es könnte gebrochen werden, und was könnte / sollte es zu verbessern?

Danke!

War es hilfreich?

Lösung

Es wäre besser, den Hash auf der Server-Seite zu speichern. Es ist denkbar, dass der Angreifer den Wert ändern kann und seinen / ihren eigenen SHA-1-Hash erzeugen und die zufällige Zeichenfolge hinzufügen (sie dies leicht herausfinden können, die Seite immer wieder den Zugriff auf). Wenn der Hash auf der Server-Seite (vielleicht in einer Art Cache) können Sie den Hash neu zu berechnen und überprüfen es, um sicherzustellen, dass der Wert nicht in irgendeiner Weise manipuliert wurde.

Bearbeiten

las ich die Frage falsch in Bezug auf die zufällige Zeichenfolge (konstante Salz). Aber ich denke, der ursprüngliche Punkt noch steht. Der Angreifer kann eine Liste der Hash-Werte, die entsprechen den verborgenen Wert aufzubauen.

Andere Tipps

Digitale Signatur

Es ist wahrscheinlich übertrieben, aber das klingt nicht anders, als wenn Sie digital eine abgehende E-Mail anmelden, damit der Empfänger seinen Ursprung überprüfen kann und die Inhalte sind verbindlich. Der manipulations sensiblen Bereichs der Signatur kann mit wenig Angst vor der mit manipulations sensiblen Bereich in die Freiheit entlassen wird nicht nachweisbar Manipulation, solange Sie die privaten Schlüssel schützen und die Daten und die Signatur mit dem öffentlichen überprüfen Taste auf Rückkehr.

Dieses Schema hat sogar die nette Eigenschaft, dass Sie „Unterzeichnung“ zu sehr geschützten Satz von Servern / Prozessen mit Zugriff auf die privaten Schlüssel begrenzen, aber mit einer größeren Gruppe von Servern / Prozessen mit dem öffentlichen Schlüssel zur Verfügung gestellt, um Prozessformularübermittlungen .

Wenn Sie ein wirklich empfindliches haben „do-not-Tamper“ Feld und kann die Hash-Signatur auf dem Server nicht halten, dann ist dies die Methode, die ich in Betracht ziehen würde.

Obwohl ich vermute, die meisten vertraut sind mit digitaler Signierung, hier einige Wikipedia für eine der Uneingeweihten:

Public Key Cryptography - Sicherheit

  

... Eine andere Art von Anwendung in   Public-Key-Kryptographie ist, dass die   Digitalsignaturverfahren. Digital   Signaturverfahren kann verwendet werden für   Absender-Authentifizierung und   Nichtabstreitbarkeit. In einem solchen System   Benutzer, der will, eine Nachricht senden   berechnet eine digitale Signatur dieser   Nachricht und sendet dann diese digitale   Signatur zusammen mit der Nachricht an   der vorgesehene Empfänger. Digital   Signaturverfahren haben die Eigenschaft,   dass Signaturen kann nur berechnet werden,   mit dem Wissen eines privaten Schlüssels.   Um zu überprüfen, dass eine Nachricht gewesen   von einem Benutzer unterzeichnet und ist nicht   modifizierte muss der Empfänger nur zu   kennen den entsprechenden öffentlichen Schlüssel. Im   In einigen Fällen (zum Beispiel RSA) gibt es   Digitalsignaturverfahren mit vielen   Ähnlichkeiten mit Verschlüsselungsverfahren. Im   andere Fälle (z DSA) der Algorithmus   nicht ähnelt keine Verschlüsselung   planen. ...

Wenn Sie die Sitzung auf dem Server nicht verarbeiten kann, sollten Sie die Verschlüsselung der Daten mit dem privaten Schlüssel und einen HMAC für sie zu erzeugen, die Ergebnisse als verstecktes Feld (n) senden. Sie können dann überprüfen, dass das, was zurückgegeben wird, übereinstimmt, was gesendet wurde, weil, da sonst niemand Ihren privaten Schlüssel kennt, niemand sonst die gültige Information erzeugen kann. Aber es wäre viel besser, die Handhabung auf der Serverseite ‚darf nicht verändert werden‘ Daten.

Sie haben, dass jemand erkennen ausreichend können Sie eine HTTP-Anforderung bestimmt senden (Formular), die die Informationen enthält, die sie wollen, die keine Beziehung tragen kann oder zu dem, was sie zuletzt gesendet.

Wenn Sie nicht / wird der Hash-Server-Seite nicht speichern, müssen Sie in der Lage sein, um wieder erzeugen sie serverseitige, um es zu überprüfen.

Für das, was es wert ist, sollten Sie auch Salz Ihre Hashes. Dies könnte sein, was Sie gemeint, als Sie sagten:

  

mit einem konstanten verketteten lang   zufällige Zeichenfolge (d.h. die gleiche Zeichenfolge   wird jedes Mal verwendet werden)

weiß, dass, wenn dieser Wert nicht anders pro Benutzer / Login / sesison, es ist nicht wirklich ein Salz Wert.

Solange Sie bewachen die „konstante lange zufällige Zeichenfolge“ mit Ihrem Leben dann Ihre Methode ist relativ stark.

Um weiter zu gehen, können Sie eine Zeit / unique „konstant lange zufällige Zeichenfolge“ 's erzeugen.

Was Sie beschreiben, ist ähnlich wie im Rahmen der Umsetzung erforderlich für das, was Kanarienvögel werden bezeichnet und werden verwendet, um Cross-Site-Request-Forgery-Angriffe zu verringern.

Im Allgemeinen ein versteckter Eingang in einem HTML-Formular enthält einen verschlüsselten Wert, der mit einer HTTP-Anforderung zurückzugesendet. Ein Browser-Cookie oder eine Zeichenkette in tagung enthält die gleichen verschlüsselten Wert, so dass, wenn der versteckte Eingabewert entschlüsselt und das Cookie / session Wert entschlüsselt wird, werden die unverschlüsselten Werte miteinander verglichen - wenn sie nicht identisch sind, die HTTP-Anforderung nicht trauen kann.

Der verschlüsselte Wert kann ein Objekt mit Eigenschaften sein. Zum Beispiel in ASP.NET MVC, verwendet die Kanarienvogel Implementierung eine Klasse, die Eigenschaften für den authentifizierten Benutzernamen enthält, ein kryptografisch Pseudozufallswert erzeugt, um die RNGCryptoServiceProvider Klasse unter Verwendung der Datumzeit (UTC-Format), an dem das Objekt erzeugt wurde, und eine optionale Salz String. Das Objekt wird dann verschlüsselt, um den Verschlüsselungsalgorithmus AES mit einem 256-Bit-Schlüssel und mit dem gleichen Schlüssel entschlüsselt, wenn die Anforderung kommt in.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top