2010-05-04 9 views
7

Ich habe eine Kleinanzeigenwebsite, auf der jeder Werbung für seine Produkte schalten kann.Passwortverifizierung; Ist das so sicher?

Für jede klassifizierte Person muss der Benutzer ein Passwort eingeben (damit er die klassifizierte Person jederzeit löschen kann).

Also im Grunde, wenn jemand ein klassifiziertes löschen möchte, klicken Sie auf das klassifizierte, klicken Sie auf die Schaltfläche Löschen, und geben Sie den Pass.

Ich benutze MySql als Datenbank.

Ich benutze diesen Code im Grunde:

if ($pass==$row['poster_password']) 

wo row [poster_password] von MySql geholt ...

Was denken Sie? Danke

+18

Bitte tel Ich habe Sie nicht ihr tatsächliches Passwort in MySQL gespeichert ... – animuson

+1

Ja, ich tue, aber hey, die Website ist noch nicht online, in der Entwicklung ... Ich fange gerade an der Sicherheitsfront jetzt ... Wie sollte Ich rette es dann? –

+0

@animuson ist es so wichtig für die Kleinanzeigen-Website? –

Antwort

9

sehen: Secure hash and salt for PHP passwords

Hash ihr Passwort (vielleicht mit etwas Salz) auf dem Weg in die Datenbank. Speichern Sie ihr Hash-Passwort in der Datenbank (NICHT ihr tatsächliches Passwort). Holen Sie dann ihr Hash-Passwort von der Datenbank und hash ihr Eingabe-Passwort und vergleichen Sie die Hash-Passwörter.

Einig lahm Pseudo-Code:

password_hash = hash(password_cleartext) 
# store password_hash in database 

Später:

input_password_hash = hash(input_password_cleartext) 
fetched_password_hash_from_db = fetch(db, password_hash) 
if (input_password_hash == fetched_password_hash_from_db) { 
    ... authenticated ... 
} 

Für einen Start mit PHP, versuchen: http://php.net/manual/en/function.sha1.php

+6

+1 für das erste Hashing zu erwähnen. ** HASHING IST NICHT ENCRYPTION PEOPLE ** - sie sind völlig unterschiedliche Konzepte * (es ist auch nicht dasselbe wie eine Prüfsumme, die nicht unbedingt kryptographisch sicher ist) *. Auch, ** MD5 ist komplett kaputt **, benutze es nicht. –

+2

+1 für die Erwähnung, dass MD5 defekt ist! – dlamotte

+0

Okay, dann ist Hash eine Funktion von PHP, denke ich? Hast du ein aktuelles Beispiel? –

0

Sie sollten das Passwort irgendwie Hash und speichern und vergleichen mit der Hash-Version. Siehe diesen Link für weitere Informationen:

http://phpsec.org/articles/2005/password-hashing.html

+0

Und ja, speichern Sie nicht das eigentliche Passwort irgendwo. – quoo

+1

Ich denke, Verschlüsselung ist hier ein trügerisches Wort. Es ist "kryptografisches Hashing", keine Verschlüsselung. Verschlüsselung klingt wie einfach das Passwort gegen Hashing zu verschlüsseln, die nicht "umgekehrt" werden kann. – dlamotte

+0

Passwörter sollten immer gehashed werden. Verschlüsselung sollte niemals für Kennwörter verwendet werden. – rook

2

Sie das aktuelle Passwort in der Datenbank nicht gespeichert werden. Speichern Sie stattdessen eine Prüfsumme (MD5, SHA1 usw.). Wenn Sie einen Vergleich durchführen möchten, führen Sie eine Prüfsumme des vom Benutzer übermittelten Werts aus und vergleichen Sie die Prüfsummen.

So haben Sie nie das eigentliche Passwort im Speicher.

+0

... oder irgendwo anders gelagert. – Steven

+0

md4, md5, sha0 andsha1 sind defekte Hash-Funktionen. Jeder, der eine Schwachstelle als Ziel hat, erhält eine -1, tut mir leid, es ist die Regel. sha256 sollte verwendet werden. – rook

+1

Sie müssen es im Speicher haben, wenn Sie es überprüfen, es sei denn, Sie hacken auf der Client-Seite in Javascript. Nicht, dass es eine Rolle spielt - wenn ein Angreifer auf den Speicher zugreifen kann, wird das Passwort das geringste Problem sein. – Tgr

0

Ich würde das Passwort verschlüsselt, bevor sie zu speichern, dann entschlüsseln, wenn es abzurufen, so dass Sie es überprüfen können, was der Benutzer im Klartext eingegeben hat (anhand Ihres Beispielcodes oben).

Schützen Sie sich auch vor allen SQL injections, oder jemand könnte alle Kennwörter (und andere Daten) in Ihrer Datenbank sehen.

+0

-1 Verschlüsselung sollte niemals für Passwörter verwendet werden. Dies ist eine eindeutige Verletzung von CWE-257 (http://cwe.mitre.org/data/definitions/257.html). Eine Message-Digest-Funktion wie sha256 sollte verwendet werden. Jeder, der eine Schwachstelle als Ziel hat, erhält eine -1, das sind die Regeln. – rook

+0

-1 für The Rook für das Sagen der Verschlüsselung sollte nie verwendet werden, dann zitiert CWE-257, die sagt "Verwenden Sie starke, nicht reversible Verschlüsselung zum Schutz gespeicherter Passwörter." –

0

Dies bedeutet, dass die Passwörter unverschlüsselt in Ihre Passwörter eingegeben werden. Wenn dies der Fall ist, sollten Sie bei der Eingabe der Passwörter eine Art Verschlüsselung verwenden. Eine Möglichkeit, dies zu tun, ist die MD5-Funktion, die das Passwort enthält.

Wenn der Einsatz tun würden Sie

Insert into table(email, password, whatever) values('$email', md5($password), whatever) 

tun Und beim Vergleich würden Sie

if (md5($pass) == $row['password']) 
+0

-1 md4, md5, sha0 andsha1 sind defekte Hash-Funktionen. Jeder, der eine Schwachstelle als Ziel hat, erhält eine -1, tut mir leid, es ist die Regel. sha256 sollte verwendet werden – rook

+0

Fair genug, könnten Sie bitte eine Quelle zur Verfügung stellen? – Gazler

+0

siehe [hier] (http://www.google.com/url?sa=t&source=web&ct=res&cd=1&ved=0CAYQFjAA&url=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi% 3D10.1.1.60.3776% 26rep% 3Drep1% 26type% 3Dpdf & ei = 5m3gS9zCLZO8Nuigsc8J & usg = AFQjCNGSF9GeeOlCrWlb4LKSRlYlLlT2-w): * "Unser vorgestellter Algorithmus [...] ** ermöglicht es uns, volle MD5-Kollisionen in nur wenigen Minuten ** auf einem 3Ghz Pentium 4 zu finden ". * Wang et al. lieferte auch (vor etwa fünf Jahren) eine Methode, die zeigt, wie man MD4-Kollisionen mit Bleistift und Papier findet. SHA1 wurde in jüngerer Zeit gebrochen, wenn auch nicht annähernd so schlimm (es gibt immer noch keine bekannten Kollisionen). –

1

Best Practice tun, um eine gesalzene sha1 Hash in der Datenbank zu halten ist:

if (sha1($pass.$row['poster_salt'])==$row['poster_password']) 

(poster_salt ist eine zufällige Zeichenfolge, die generiert und gespeichert wird, wenn der Benutzer das Kennwort auswählt.)

Auf diese Weise, wenn ein Angreifer Zugriff auf Ihre Datenbank erhält, erhalten sie immer noch nicht die Passwörter der Benutzer (die wahrscheinlich auch woanders verwendet werden - die meisten Leute nicht zu verschiedenen Passwörtern für verschiedene Websites wählen).

Auch sollten Sie sichere (HTTPS) Verbindung verwenden. Und verlangen Sie ausreichend starke Passwörter.

(zumindest, wenn Sie gute Sicherheit wollen, die vielleicht zuviel des Guten im Fall einer einfachen Anzeige Liste sein).

+0

md4, md5, sha0 und sha1 sind defekte Hash-Funktionen. Jeder, der eine Schwachstelle als Ziel hat, erhält eine -1, tut mir leid, es ist die Regel. sha256 sollte verwendet werden – rook

+0

+1 beste Antwort so weit. @The Rook: Das scheint ein bisschen unfair, SHA1 ist nicht annähernd so wie die anderen drei gebrochen (keine Kollisionen haben auch noch nicht gefunden) –

+1

@BlueRaja können Sie uns zeigen, eine MD5-Schwäche eine Kollision mit bitte? –

4

Ihr Code sieht sicher aus, aber Ihr Design benötigt möglicherweise etwas Arbeit.

SQL Injection

Der gefährliche Teil des Codes ist alles in der Datenbank in der Speicherung oder die Benutzer zeigen etwas wird, dass von dem Benutzer gesammelt. Der Teil, mit dem Sie vorsichtig sein müssen, tritt also vor Ihrem Beispiel auf. Stellen Sie sicher, dass Sie alle Daten, die Sie vom Benutzer erfassen, einschließlich des Kennworts und der Anzeigeninformationen, überprüfen, filtern und ausschließen.

Encryption

Der Vorteil des Passworts in der Datenbank gespeichert ist, dass Sie der Benutzer das Passwort per E-Mail abrufen lassen kann oder andere Mittel, wenn sie es verlieren. Wenn Sie jedoch Kennwörter speichern, sollten Sie sie verschlüsselt mit einem geheimen Schlüssel speichern, damit, wenn jemand den Lesezugriff auf Ihre Datenbank steuern kann, sie nicht alle Kennwörter im Nur-Text-Format lesen können. Trotzdem müssen Sie den geheimen Schlüssel irgendwo speichern, und wenn jemand Ihren geheimen Schlüssel bekommt und Zugriff auf Ihre Datenbank hat, hat er Zugriff auf alle Passwörter.

Hashwerte (empfohlen)

Es ist am beste Praxis und sicherer nur eine Möglichkeit, Hash-Werte zu speichern (SHA1 oder SHA256) der Passwörter in der Datenbank anstelle der tatsächlichen Passwörter. Auf diese Weise können Sie das Passwort nicht abrufen. Hash-Werte sind absichtlich eine Möglichkeit, indem einige der Daten weggeworfen werden.

Anstatt das ursprüngliche Passwort des Abrufens, hash Sie das Kennwort, das der Benutzer eingibt und den Hash-Wert mit dem gespeicherten Hash-Wert zu vergleichen, um zu sehen, ob es passt. Wenn der Benutzer in diesem Fall das Kennwort verliert, senden Sie dem Benutzer ein neues, nach dem Zufallsprinzip generiertes Kennwort, anstatt das Kennwort an den Benutzer zu senden.

Wenn Sie nur den Hash-Wert speichern, werden Ihre Daten noch weiter geschützt. Selbst wenn der Benutzer Lesezugriff auf Ihre Datenbank hat, bieten die Hashwerte keinen Vorteil und es gibt keinen geheimen Schlüssel, der alle Ihre Hashwerte entsperrt.

Wenn Sie die Kennwörter hashen, achten Sie darauf, einen zufälligen Salt-Wert zu verwenden und das Salz zu speichern, um Ihre Liste der Hashes gegen Rainbow-Angriffe zu schützen.

Zusammenfassung

Manchmal bekommt man nicht das Passwort zu wählen. Manchmal kommt das Passwort von einem anderen System, so dass Sie nicht immer die Wahl haben, und manchmal verlangen Ihre Vorgesetzten (vielleicht sogar die Benutzer), dass sie Kennwörter abrufen können. Wenn möglich, sollten Sie jedoch die sicherere Option wählen .

Beachten Sie, dass all diese Verschlüsselungs- und Hash-Wert-Geschäfte Ihren Server nur teilweise vor Personen schützen, die schreibgeschützten Zugriff auf Ihre Daten erhalten. Manchmal reicht es aus, wenn Sie Ihre Daten erhalten, wenn der Benutzer den Passwort-Hash lesen kann. Kann er dann Ihre Kreditkartennummern lesen?

Sie müssen Ihre Datenbank schützen. Haben Sie ein sicheres Passwort auf Ihrem Datenbanksystem? Erlauben Sie nur lokalen Zugriff auf Ihre Daten? Haben Sie einen Datenbankbenutzer mit den wenigsten Berechtigungen für die Verwendung in Ihrer Anwendung erstellt? Schützen Sie sich ordnungsgemäß vor SQL Injection- und Scripting-Angriffen?

Wenn jemand Lese- und Schreibzugriff auf Ihre Daten hat, wird das gesamte Passwortgeschäft strittig.

0

mein Vorschlag ist, die folgende

die Benutzer-Tabelle hat zwei Spalten, eine als „Passwort“ und das andere „Salz“

$password = 'youruserpassword in plain text'; 
$salt = bin2hex(openssl_random_pseudo_bytes(32)); 
$passtostore = hash_hmac('sha384', $password, $salt); 
insert into users(password, salt) values($passtostore, $salt); 

Dann, um zu überprüfen, ob der Benutzer das richtige Passwort eingegeben hat. ..

sowohl Passwort und Salz aus der Datenbank retrive und

if(hash_hmac('sha384',$userpass, $row['salt']) === $row['password']) { 
// is valid 
}