2008-11-30 16 views
5

Ich möchte einen zufälligen Salt-Wert generieren und in den Anwendungsstatus versetzen.Wie generiert man am besten ein zufälliges Salz für eine Website?

Jetzt verwende ich eine Webfarm, so dass der Anwendungsstatus je nach Maschine unterschiedlich ist. Ich möchte auch keine verteilte Farm-Apps kaufen.

Also .. was sind einige Lösungen dafür? Ich dachte, ich könnte es in den Code oder die Datei web.config hart-Code .. aber das bedeutet das gleiche Salz für eva .. nicht sehr sicher.

Hat jemand irgendwelche Vorschläge?

Erinnern Sie sich - ich bin nach einem eindeutigen Schlüssel (zB einer GUID), die auf allen Maschinen gleich ist. Vielleicht ist eine Konfigurationsdatei der einzige Weg?

+0

Können Sie erklären, was der Punkt wäre? Wenn nicht jedes einzelne Farmmitglied dieselbe Sequenz von Zufallszahlengenerationen erstellt, werden sie aus der "Synchronisierung" aussteigen. Worum geht es also? – cletus

+0

das ist GENAU meine Frage. Server 'A' erzeugt ein zufälliges Salz, das etwas hasht. Ergebnis geht an den Kunden. Der Client antwortet auf die Farm (übergibt die Warteschlange), trifft aber den Server "B". Server 'B' muss denselben Hash generieren (mit demselben Salt), um ihn mit Client-Hash-Daten zu vergleichen. –

Antwort

4

Wenn ich richtig verstehe, möchten Sie, dass die Maschinen einen Wert teilen, und Sie möchten nicht, dass der Wert für immer gleich bleibt. Im Idealfall möchten Sie es nicht speichern.

Also, die "erste" Maschine einen zufälligen Wert beim Start zu generieren, (mit welcher Entropie kann es wie/dev/random. Wenn Sie nicht benötigen einen sicheren Wert, und nicht genug Entropie bei Starten Sie, um einen trotzdem zu erstellen, verwenden Sie die Zeit oder was auch immer), und kommunizieren Sie es mit allen anderen. Wenn neue Maschinen dem Cluster beitreten, müssen sie in der Lage sein, den Wert von einer Maschine zu finden, die sich bereits im Cluster befindet. Ausfallende Maschinen machen keinen Unterschied.

Welche Maschine ist die "erste"? Nun, wenn Sie immer eine Maschine vor allen anderen booten können, und geben Sie Zeit, um einen Wert zu generieren, dann können Sie den trivialen Algorithmus verwenden:

1) Suchen Sie nach anderen Maschinen. Wenn Sie einen finden, fragen Sie ihn nach dem Wert. 2) Wenn Sie keinen finden, generieren Sie den Wert selbst.

Wenn mehrere Maschinen gleichzeitig starten, müssen sie sich untereinander entscheiden, wer der "Führer" ist. Sie können dies tun, indem Sie eine selbst auswählen (zB eine Maschine erklärt sich selbst zum "Führer", sobald sie eine bestimmte Verbindung über die Admin-Schnittstelle erhält): Beim Start wartet jede Maschine, bis sie diese Verbindung erhält oder von einer anderen Maschine hört Maschine ist der Führer). Es ist trivial, das bei einem Token-Ring automatisch zu tun: der Rechner mit der geringsten MAC-Adresse oder was auch immer der Anführer ist. Aber niemand benutzt Token Ring mehr ...

Am entgegengesetzten Ende eines unzuverlässigen Netzwerkes bin ich mir nicht sicher, ob es überhaupt möglich ist, es sei denn, alle Maschinen wissen, wie viele es insgesamt gibt (in diesem Fall ist es einfach so der Token Ring, außer dass sie alle miteinander reden, bis sie herausgefunden haben, wer der Anführer ist). Mit der zuverlässigen Übertragung, die man in vernünftigen Grenzen auf dem Ethernet annehmen kann, bin ich mir sicher, dass irgendwo ein optimaler Algorithmus veröffentlicht wird, aber ich vergesse, was es ist (wenn ich es jemals wüsste). Ich nehme an, dass jeder in regelmäßigen Abständen seine Meinung über den Anführer ausstrahlt (einschließlich seiner eigenen Behauptung, wenn er noch keine bessere gesehen hat). Wenn du das lange genug gehört hast (ungefähr ein Intervall), wirst du wissen, wer der Anführer ist, und du kannst anfangen, den Samen zu benutzen.

Wenn der Wert ein Geheimnis ist, muss die Kommunikation innerhalb des Clusters sicher sein. Je nach Netzwerkarchitektur erhalten Sie das kostenlos.

+1

er .. das ist faaaaaaaaaaaaar zu viel Aufwand für einen zufälligen Salzwert, der nicht so wichtig ist. Du bist auch bezüglich deines Anfangsparagraphen korrekt. –

+1

Nun, ich weiß nicht, wie wichtig Ihre Zufallszahlen sind. Randomness variiert von "kann auch nur immer 23 verwenden" bis hin zu "firmengefährdend", so dass ich auf der Seite von Over-Engineering bin ;-) –

2

In einem Webfarm-Szenario könnte das in machine.config gespeicherte machine key das sein, wonach Sie suchen. Es ist ein zufällig generierter Hash, der auf allen Computern in der Webfarm gleich sein muss.

+0

Ich dachte daran, aber das ist immer noch ein Wert in der web.config. Also habe ich nachgesehen, ob das ein guter Weg ist. –

0

Ist hier eine Spaß/interessante Art und Weise:

Zu Beginn eines jeden Tages, das heißt, nach 00:00 Uhr, Lookup twitter oder digg oder Friend oder irgendetwas, das kurz vor/bei 00 häufig Daten für ein Detail hat Ändern : 00. Alle Maschinen würden die gleichen Daten bekommen und es würde sich garantiert ändern. Um es zu einem Geheimnis zu machen, kombinieren Sie dieses Detail mit einem geheimen Schlüssel oder dem MAC des DNS-Servers oder so etwas.

Ich denke, das ist einfach genug und eine lustige Sache. Natürlich würde dies bedeuten, dass Ihre Website für eine triviale Sache von dieser externen Website abhängig ist und schwierig sein könnte, wenn die Website nicht verfügbar ist. Aber in solchen Fällen können Sie die Daten des Vortags behalten und fortführen.

Ich wollte nur darüber schreiben als eine lustige/interessante Art und Weise :)

+0

:) lolz. niedlich, aber ich kann mich nicht auf einen anderen externen Endpunkt verlassen. –