LU06k - Passwortsicherheit

Sicherheit ist ein entscheidender Aspekt in jeder Webanwendung. Ein wichtiges Element der Sicherheit ist die sichere Speicherung von Passwörtern. In dieser Lektion konzentrieren wir uns auf das Hashing von Passwörtern.

Warum Passwort-Hashing?

In einer sicheren Anwendung sollten Passwörter niemals im Klartext gespeichert werden. Anstelle dessen sollten sie gehasht werden, und der Hash-Wert sollte in der Datenbank gespeichert werden. Dies macht es für Angreifer schwierig, das ursprüngliche Passwort wiederherzustellen, selbst wenn sie Zugriff auf die Datenbank erhalten.

Verwendung von bcrypt

Python bietet verschiedene Bibliotheken für das Passwort-Hashing, eine der beliebtesten ist bcrypt. Sie können bcrypt mit pip installieren:

pip install bcrypt

oder im requirements.txt ergänzen:

requirements.txt
...
bcrypt==4.0.1

Hashing in der DAO-Klasse

Nach der Installation können Sie bcrypt in Ihrer DAO-Klasse verwenden, um das Passwort zu hashen:

import bcrypt
 
class UserDao:
    # ...
    def add_user(self, user):
        hashed_pw = bcrypt.hashpw(user.password.encode('utf-8'), bcrypt.gensalt())
        self.cursor.execute("INSERT INTO users (username, email, password) VALUES (?, ?, ?)", (user.username, user.email, hashed_pw))
        self.conn.commit()
    # ...

Authentifizierung

Bei der Authentifizierung wird das vom Benutzer eingegebene Passwort ebenfalls gehasht und mit dem in der Datenbank gespeicherten Hash verglichen:

@app.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    user = user_dao.get_user_by_username(data['username'])
    if user and bcrypt.checkpw(data['password'].encode('utf-8'), user.password):
        login_user(user)
        return jsonify({'success': True}), 200
    return jsonify({'error': 'Invalid username or password'}), 401

Durch die Verwendung von Passwort-Hashing erhöhen Sie die Sicherheit Ihrer Anwendung erheblich.


© Kevin Maurizi