2 Stimmen

Eindeutige Identifikatoren, die benutzerfreundlich und schwer zu erraten sind

Mein Team arbeitet an einer Anwendung mit einer Legacy-Datenbank, die zwei verschiedene Werte als eindeutige Bezeichner für ein Gruppenobjekt verwendet: Id ist eine automatisch inkrementierende Identitätsspalte, deren Wert von der Datenbank beim Einfügen bestimmt wird. GroupCode wird durch die Anwendung bestimmt nach Einfügung, und ist "Group" + theGroup.Id .

Was wir brauchen, ist ein Algorithmus zur Erzeugung von GroupCodes, die:

  1. sind einzigartig.
  2. Sie sind für einen Benutzer relativ leicht richtig einzugeben.
  3. sind für einen Hacker schwer zu erraten.
  4. werden entweder von der Datenbank beim Einfügen erstellt oder von der Anwendung vor dem Einfügen erstellt (d. h. sie sind nicht von der Identitätsspalte abhängig).

Die bestehende Lösung erfüllt die ersten beiden Kriterien, aber nicht die letzten beiden. Kennt jemand eine gute Lösung, die alle oben genannten Kriterien erfüllt?

Noch ein Hinweis: Obwohl dieser Code extern von den Benutzern verwendet wird und obwohl Id ein besserer Bezeichner für andere Tabellen wäre, um ihre Fremdschlüssel damit zu verknüpfen, wird der GroupCode von anderen Tabellen verwendet, um auf eine bestimmte Gruppe zu verweisen.

Vielen Dank im Voraus.

1voto

Kane Punkte 15977

Haben Sie die Base32/Base36-Kodierung von Inhalten untersucht? Die Base32-Darstellung einer Identity-Seed-Spalte macht sie eindeutig, ist leicht einzugeben, aber definitiv nicht sicher. Die meisten Nicht-Programmierer haben jedoch keine Ahnung, wie der String-Wert generiert wird.

Auch mit Base32/36 können Sie normale datenbankbasierte Primärschlüssel aufrechterhalten.

1voto

Jonas Elfström Punkte 29746

Wäre es möglich, eine neue Spalte hinzuzufügen? Sie könnte aus der Identität und einer zufälligen 32-Bit-Zahl bestehen.

Diese 64-Bit-Zahl könnte dann in eine "speicherbare Zufallszeichenfolge" übersetzt werden. Das wäre sicherheitstechnisch nicht perfekt, könnte aber gut genug sein.

Hier ist ein Beispiel mit Ruby und dem Koremutake gem .

require 'koremu'
# http://pastie.org/96316 adds Array.chunk
identity=104711
r=rand(2**32)<<32 # in this example 5946631977955229696
ka = KoremuFixnum.new(r+identity).to_ka.chunk(3)
ka.each {|arr| print KoremuArray.new(arr).to_ks + " "}

Ergebnis:

TUSADA REGRUMI LEBADE

Besuchen Sie auch Algorithmen zur Erzeugung phonetisch einprägsamer Passwörter .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X