2009-09-08 2 views
13

ich derzeit verwenden,
base64_encode() des Kennwort eines Benutzers zu kodieren, das funktioniert gut, weil es mir erlaubt, einfach base64decode() verwenden das Passwort zu einem Wort zu dekodieren und Senden Sie eine E-Mail, wenn sie dort ihr Passwort verlieren.beste Art und Weise Passwörter in PHP zu kodieren

Ich habe über Passwort gelesen und viele Leute scheinen zu sagen, dass Sie sha1() verwenden sollten, um ein Passwort zu verschlüsseln. Ich bin alles für die Verbesserung der Sicherheit meines Systems, aber wenn ich umwandeln, um shal() zu verwenden, dann werde ich nicht in der Lage sein, einen Benutzer dorthin verlorenes Passwort zu senden.

Was verwenden Sie? Kannst du mir einen Rat geben? Und gibt es eine Möglichkeit, zu einem lesbaren Passwort zu dekodieren, um einen Benutzer zu mailen?

Als ich diese Frage eintippte, erinnerte ich mich gerade daran, dass einige Foren Ihnen kein Passwort schicken, sondern einen speziellen Link, um Ihr Passwort neu zu setzen. Ich nehme an, dass dies daran liegt, dass Sie Ihr Passwort nicht entschlüsseln können könnte sein?

//what I use now 
$password_encoded = base64_encode($password); 

//what I am considering using 
$password_encoded = sha1($password); 
+4

Sehen Fragen wie diese wirklich machen mich nie wollen eine Benutzeranmeldung auf einer Website aus Angst vor ihrer schrecklichen Sicherheit, wie reversible Passwortspeicherung. – umassthrower

Antwort

41

Bitte, bitte im Interesse der Benutzer nicht speichern ihre Passwörter in jedes reversible Format! Es spielt keine Rolle, ob es Base64-codiert oder triple-DES 168-bit encryption - ist, wenn es reversibel ist, ist es genauso sicher, als wenn Sie es überhaupt nicht codieren würden.

Keine Website, die Interesse daran hat, sich selbst oder ihre Benutzer zu schützen (oder hat einen Sinnsinn) wird einem Benutzer ihr Passwort per E-Mail senden. Das Einzige, was wir tun können, ist die Möglichkeit, Benutzern eine E-Mail mit einem einmaligen, einmaligen Link zu senden, mit dem sie ein neues Passwort festlegen können.

  • Shop einen Hash (bcrypt oder PBKDF2) des Passworts, die salted
  • Wurf war das ursprüngliche Passwort weg, sobald Sie es gehasht haben. Nimm es aus dem Gedächtnis heraus.
  • erfordern immer die Benutzer ihr eigenes neues Passwort über einen SSL-Kanal ist ehrlich gesagt nur Fahrlässigkeit

Des Versuch, zu erhalten, indem sonst mit nichts zu schaffen. Lassen Sie uns ein sehr häufiges Szenario verwenden, das in Sicherheitsdiskussionen verwendet wird:

Benutzer Frederics E-Mail ist kompromittiert. Dies kann passieren, wenn Sie den Computer entsperrt lassen oder ein schwaches Passwort verwenden. Unabhängig davon hat eine nicht autorisierte Person Zugriff auf ihre Nachrichten. Idealerweise würde dies nichts weiter bedeuten als peinliche Liebesbriefe, die ein Fremder liest. Unglücklicherweise entdeckt die nicht autorisierte Person, dass ein Forum Frederics Passwort im Klartext per E-Mail versendet. Wie die meisten Benutzer verwendet Frederic für alles, einschließlich seines Online-Banking, das gleiche Passwort. Sein Benutzername ist in einer E-Mail von seiner Bank aufgeführt. Jetzt ist die Situation sehr bedauerlich.

Benutzer vertrauen auf Sie, wenn sie eine mit Anmeldeinformationen verknüpfte Beziehung mit Ihnen erstellen. Teil dieses Vertrauens ist, dass Sie diese Anmeldeinformationen als sicheres Geheimnis zwischen Ihnen und ihnen behalten.

Verwandte

Viele der umliegenden Themen und Ideen wurden auf SO sehr gut beantwortet:

+0

@anonymous - Warum die DV? –

+0

False: "Genau so sicher, als ob Sie es überhaupt nicht codiert hätten" –

+6

@ d03boy Sicherheit durch Obscurity ist das gleiche wie überhaupt keine Sicherheit. In einem in sich abgeschlossenen System wie einer Website müssen notwendigerweise alle notwendigen Teile vorhanden sein, um Daten rückgängig zu machen, egal wie verschleiert sie sind. Wenn also ein Angreifer Zugriff auf das System erhält, hat der Angreifer Zugriff auf alle Teile. –

6

Sie sollten einen Benutzer RESET ein Passwort, aber nie ihr Passwort abzurufen. Aus diesem Grund sollten Sie einen Einweg-Hash-Code (SHA2) anstelle einer Verschlüsselungsmethode verwenden, mit der Sie ihn decodieren können.

Stellen Sie sich vor, Sie hätten Ihre E-Mail geöffnet. Ich könnte einfach verlangen, Ihr Passwort für eine Website abzurufen, löschen Sie die E-Mail, und Sie würden nie wissen. Auf der anderen Seite, wenn Sie möchten, dass ich stattdessen das Passwort zurücksetze, würde sich das Account-Passwort ändern und der Besitzer würde offensichtlich erkennen, dass etwas nicht stimmt. (Dies ist ein dummes Szenario, aber das Konzept ist was wichtig ist)

Hashes kann "umgekehrt" werden, indem alle möglichen Kombinationen von Wörtern (oder Rainbow-Tabellen) versucht werden, bis ein passender Hash erzeugt wird. Eine Möglichkeit, dies zu vermeiden, besteht darin, das bereitgestellte Passwort mit einem Salz zu verbinden, um es zu einer sehr langen und unvorhersehbaren Zeichenkette zu machen. Das Salz sollte eine eindeutige Datenfolge sein, die für das Konto des einzelnen eindeutig ist.

In PHP gibt es keine SHA2-Funktion. SHA-2 ist eine Familie von Hash-Algorithmen (SHA-256, SHA-384, SHA-512, etc ...)

hash('sha256', 'The quick brown fox jumped over the lazy dog.'); 
+0

Ich versuche, sha2 zu finden, es scheint nicht auf meinem php zu sein – JasonDavis

+0

Aktualisiert mit sha-2 info –

10

Als Administrator Sie eigentlich nie das Passwort ein, daran zu erinnern brauchen Benutzer. Sie müssen nur wissen, ob eine Zeichenfolge, die sie einmal gesendet haben, identisch ist mit einer anderen.

Wenn ein Benutzer sein Passwort vergisst, muss ihm sein altes Passwort nicht mitgeteilt werden. Sie können einfach ein neues Passwort eingeben.

Da Sie die tatsächlichen Passwörter nicht kennen müssen, würde die Verwendung eines crytographic hash der Wörter wie eine sichere Möglichkeit erscheinen, sie zu speichern. Es wurden jedoch große Tabellen mit vorberechneten Strings erstellt, um leicht einen umgekehrten Lookup des Hashs durchzuführen, dessen Originalstring zurückgegeben wird. Diese heißen rainbow tables.

Um ein einfaches Nachschlagen der vorberechneten Zeichenfolge zu vermeiden, sollten Sie Ihre Kennwörter vor dem Hashing salt eingeben. Dem Benutzernamen kann der Benutzername vorangestellt oder die Benutzer-ID nachgestellt werden, unabhängig von den zusätzlichen Informationen, die Sie für den Benutzer haben und die Sie während der Authentifizierung problemlos zum Kennwort hinzufügen können.

+0

Ich sehe so, wenn ich einen Benutzer nehmen würde übergeben Passwort und fügen Sie dort Benutzer-ID Nummer, die nie zu dort Passwort ändert, dann verschlüsseln Sie diese Zeichenfolge, das wäre ein gesalzenes Passwort? – JasonDavis

+3

@jasondavis Hash, nicht verschlüsseln –

4

Base64Encode Angebot keine Sicherheit, denn jeder kann es leicht umkehren.

Wenn Sie absolut brauchen, um das Passwort umzukehren, ist eine gute Möglichkeit, eine geheime Frage zu verwenden, und die Antwort als Verschlüsselungsschlüssel zu verwenden. Sobald das Passwort verschlüsselt ist, wirfst du die Antwort weg (du speicherst sie nicht). Sie verwenden auch die standardmäßige sha1-Verschlüsselung für die Zeit, in der Sie sicherstellen müssen, dass er das richtige Passwort eingibt. Wenn der Benutzer sein Passwort möchte, gibt er die Antwort auf seine geheime Frage ein, und Sie verwenden diese, um das Passwort wiederherzustellen und es an ihn zurückzusenden.

Es ist nicht so sicher wie Hash-basierte Verschlüsselung, aber wenn Sie das Passwort zurücksenden müssen, ist es ein guter Kompromiss.

Sie können an der mcrypt Bibliothek für PHP aussehen wollen http://ca3.php.net/mcrypt

1

ich mein Konto löschen immer nur alle Websites mein Kennwort, das mir E-Mails. Ich habe zu viel Mühe und Zeit damit verbracht, lange zufällige Passwörter auswendig zu lernen, um sie mir im Klartext zukommen zu lassen.

Verwenden Sie sha1() oder höher nicht reversiblen Hash, um das Passwort zu identifizieren. Wenn Sie ein Benutzerkennwort authentifizieren, rufen Sie den Hashwert ab und vergleichen Sie ihn mit dem Hashwert des Kennworts, das während der Authentifizierung angegeben wurde. Wenn sie übereinstimmen, ist der Benutzer innerhalb angemessener Standards authentisch.

$user = "joe"; 
$password = 'password'; 

$saved_hash = DB::Query("select hash from users where username = ".quote($user)." LIMIT 1"); 

if (sha256($password) == $saved_hash) User::authenticated(); 

Nie jemals Passwörter in E-Mail senden. Senden Sie einen einzigartigen, nicht vorhersagbaren, erzeugten Schlüssel, wie in PHP:

$key = sha256(time().rand().$secret_seed); 

senden diesen Schlüssel an den Client, für die einmaligen Gebrauch, ein neues Passwort zu setzen.

+3

Hatte DV für die schlechte Demonstration von SQL –

+0

Was ist schlecht über diese SQL? – bucabay

5

Ein absolutes Muss zu diesem Thema ist Jeffs eigene You're Probably Storing Passwords Incorrectly. Hier ist die Zusammenfassung:

  1. Erfinden Sie nicht Ihre eigenen "cleveren" Passwort-Speicher-Schema.
  2. Speichern Sie Kennwörter niemals als Nur-Text.
  3. Fügen Sie jedem gespeicherten Kennwort ein langes, einmaliges zufälliges Salz hinzu.
  4. Verwenden Sie einen kryptografisch sicheren Hash.
0

Sie einen Hash verwenden möchten (vorzugsweise SHA1) mit „Salz“

+1

Ich denke, noch mehr bevorzugt würden Sie SHA2 –

+1

Trotz Bedenken, dass SHA1 einen mathematischen Fehler hat, die leichter zu Kollisionen führen kann, einschließlich eines Salzes wird ein solches Auftreten verhindern. Sprachen wie PHP unterstützen SHA2 nicht in der Standardbibliothek, daher ist SHA1 eine sehr geeignete Alternative. –

0

Sie können auf dem Server das Hashing tun, wenn in einem schnellen Abfrage Authentifizierung:

SELECT * FROM user WHERE password = MD5(CONCAT(?, salt)); 
+0

Dies ist ein schreckliches schwaches Hash-Schema. Passwörter sollten nicht mit MD5 gehashed werden, da dieser Algorithmus viel zu schnell ist und Brute-Forcing zu einfach ist. – martinstoeckli