2016-07-08 2 views
0

bevor ich im nächsten Jahr AS-level Computer Science starten, habe ich eine kleine Übung Aufgabe über den Sommer zu tun.python3 - Speichern von Benutzernamen und Hash-Passwort in einem .csv

Es ist ein Spiel, das eine Anmeldung mit Benutzername und Passwort erfordert und dann erfordert, um die Benutzer Scores zu speichern.

Ursprünglich wollte ich nur eine TXT-Datei haben, die nach jedem Benutzer benannt wurde, wobei die erste Zeile ein Klartext-Passwort ist, das das Programm bei der Anmeldung liest. Um den Punktestand zu speichern, würde ich den Rohwert an eine neue Zeile am Ende des Dokuments anhängen.

Jetzt denke ich darüber nach, ich frage mich, ob es besser und aufgeräumter wäre, eine .csv-Datei zu haben und alle Benutzernamen jedes Benutzers in der ersten Spalte zu speichern, dann ein gesalzenes und gehashtes Passwort in der zweiten Spalte für den Benutzer, indem ich in der gleichen Reihe bin (hauptsächlich, weil ich denke, dass das interessant ist und es lernen möchte, eher, dass es für mein Programm notwendig ist), dann die nächsten Reihen jede Punktzahl genommen zu haben.

Ich weiß nicht wirklich, wie ich gehen würde, um die erste Spalte zu überprüfen, ob es einen Benutzernamen gibt, den der Benutzer einzugeben versucht, und dann, wie ich das eingegebene Passwort mit dem Passwort in derselben Zeile vergleichen würde aber eine Spalte entlang

Jede Beratung wird sehr geschätzt, aber in der Zwischenzeit werde ich versuchen, und es herauszufinden (afterall Sie sollten „-Code zu lernen, nicht-Code Lernen“) ich werde Post zurück, wenn i Erhalten Sie überall

Vielen Dank im Voraus für jede Hilfe :) Alex

+0

Wie über eine Datenbank? Sie könnten die integrierte [sqlite] (https://docs.python.org/3/library/sqlite3.html) verwenden. (BTW scheint dies wie eine Tool/Offsite-Ressource Empfehlung, die off Thema ist.) –

+0

Ich werde definitiv einen Blick hinein, aber letztes Mal versuchte ich SQL massiv über komplizierte Dinge für mich selbst zu verwenden: P – AlexV933

+0

Sie könnten versuchen Sie etwas wie https://github.com/jaraco/keyring für sichere Passwortspeicherung. – OmerBA

Antwort

0

Ich glaube nicht, dass CSV das richtige Format ist, um Passwörter in Python zu speichern. Wie wäre es mit Json?

ich einige Beispiel geschrieben haben, die um einige dict wickelt und speichert es ist Inhalt in ein Json-Datei:

import codecs 
import crypt 
import hmac 
import json 
import os 


class Secret: 
    def __init__(self, filename='passwords.json'): 
     self.filename = filename 
     self.content = self.read_file() 

    def read_file(self): 
     if os.path.exists(self.filename): 
      with codecs.open(self.filename, 'r', encoding='utf-8') as rf: 
       return json.loads(rf.read()) 

     # create defaults if file does not exist 
     return dict(
      salt=crypt.mksalt(), 
      users=dict() 
     ) 

    def write_file(self): 
     with codecs.open(self.filename, 'w', encoding='utf-8') as wf: 
      return wf.write(json.dumps(self.content, sort_keys=True, indent=4)) 

    def set_user_password(self, name, password): 
     self.content['users'][name] = crypt.crypt(name, password) 
     self.write_file() 

    def check_user_password(self, name, password): 
     if name in self.content['users']: 
      hashed = self.content['users'][name] 
      if hmac.compare_digest(hashed, crypt.crypt(name, password)): 
       return True 
     return False 

Bitte beachten:

Dieses Beispiel blind auf die Dokumentation basiert der crypt-module - Ich habe keine Ahnung, ob dies in irgendeiner Weise sicher (wahrscheinlich nicht). Weiter: Ich weiß nicht, ob es gut ist, das Salz neben den Passwörtern zu speichern.

Sie können es wie folgt verwenden:

if __name__ == '__main__': 
    secret = Secret(filename='passwords.json') 
    secret.set_user_password('demo_user', 'lolcat') 

    for user, password in [ 
      ('demo_user', 'lolcat'), 
      ('demo_user', 'wrong_pass'), 
      ('wrong_user', 'wrong_pass'), 
    ]: 
     print(
      'user:', user, 'password:', password, 
      '\n-->', secret.check_user_password(user, password) 
     ) 

Es schafft eine Json-Datei wie folgt aus:

{ 
    "salt": "rT", 
    "users": { 
     "demo_user": "lo1JY.PCooh4." 
    } 
} 
+0

vielen Dank für die Eingabe, ich entschied mich am Ende nur eine txt-Datei zu verwenden, da dies viel einfacher war. Da es im Sommer nur ein Übungsstück war, musste der Passwortspeicher nicht sicher sein, aber ich fand das Hashing des Passworts interessant. Hier ist das letzte Spiel, wenn Sie interessiert sind (es ist ziemlich klobig, aber es funktioniert, ich bin sicher, ich werde es in den nächsten Wochen verbessern): [code] (http://pastebin.com/UPnMyuWP) – AlexV933