Verbessere Passwort-Sicherheit mit stärkerem Salting und Hashing
This commit is contained in:
parent
52a336a788
commit
b0d8d4f915
@ -1,6 +1,7 @@
|
|||||||
from flask import Flask, request, jsonify, g, redirect, url_for, session as flask_session, render_template, flash
|
from flask import Flask, request, jsonify, g, redirect, url_for, session as flask_session, render_template, flash
|
||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
from werkzeug.security import generate_password_hash, check_password_hash
|
from werkzeug.security import generate_password_hash, check_password_hash
|
||||||
|
import secrets # Für bessere Salt-Generierung
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
import jwt
|
import jwt
|
||||||
import datetime
|
import datetime
|
||||||
@ -174,7 +175,15 @@ def get_all_users():
|
|||||||
|
|
||||||
def create_user(username, password, display_name=None, email=None, role='user'):
|
def create_user(username, password, display_name=None, email=None, role='user'):
|
||||||
user_id = str(uuid.uuid4())
|
user_id = str(uuid.uuid4())
|
||||||
password_hash = generate_password_hash(password)
|
|
||||||
|
# Verwende einen sicheren Hash-Algorithmus (pbkdf2:sha256) mit mehr Iterationen (150000)
|
||||||
|
# und automatischem Salting durch Werkzeug
|
||||||
|
password_hash = generate_password_hash(
|
||||||
|
password,
|
||||||
|
method='pbkdf2:sha256',
|
||||||
|
salt_length=16 # Standardwert ist 8, aber wir erhöhen auf 16 für mehr Sicherheit
|
||||||
|
)
|
||||||
|
|
||||||
display_name = display_name or username
|
display_name = display_name or username
|
||||||
|
|
||||||
db = get_db()
|
db = get_db()
|
||||||
@ -184,6 +193,7 @@ def create_user(username, password, display_name=None, email=None, role='user'):
|
|||||||
)
|
)
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
|
app.logger.info(f"Benutzer {username} erstellt mit sicherem Password-Hash (pbkdf2:sha256, salt_length=16)")
|
||||||
return get_user_by_id(user_id)
|
return get_user_by_id(user_id)
|
||||||
|
|
||||||
def update_user(user_id, username=None, password=None, display_name=None, email=None, role=None):
|
def update_user(user_id, username=None, password=None, display_name=None, email=None, role=None):
|
||||||
@ -200,7 +210,12 @@ def update_user(user_id, username=None, password=None, display_name=None, email=
|
|||||||
|
|
||||||
if password:
|
if password:
|
||||||
values.append('password_hash = ?')
|
values.append('password_hash = ?')
|
||||||
params.append(generate_password_hash(password))
|
# Verwende den gleichen verbesserten Hashing-Mechanismus wie bei create_user
|
||||||
|
params.append(generate_password_hash(
|
||||||
|
password,
|
||||||
|
method='pbkdf2:sha256',
|
||||||
|
salt_length=16
|
||||||
|
))
|
||||||
|
|
||||||
if display_name:
|
if display_name:
|
||||||
values.append('display_name = ?')
|
values.append('display_name = ?')
|
||||||
@ -233,7 +248,30 @@ def delete_user(user_id):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def check_password(user_dict, password):
|
def check_password(user_dict, password):
|
||||||
return check_password_hash(user_dict['password_hash'], password)
|
# Überprüfe das Passwort mit dem gespeicherten Hash
|
||||||
|
is_valid = check_password_hash(user_dict['password_hash'], password)
|
||||||
|
|
||||||
|
# Wenn das Passwort gültig ist, überprüfe, ob der Hash aktualisiert werden muss
|
||||||
|
if is_valid:
|
||||||
|
# Überprüfe, ob der aktuelle Hash nicht das empfohlene Format verwendet
|
||||||
|
if not user_dict['password_hash'].startswith('pbkdf2:sha256:'):
|
||||||
|
# Hash muss aktualisiert werden, da er nicht den neuesten Sicherheitsstandards entspricht
|
||||||
|
app.logger.info(f"Migriere unsicheren Passwort-Hash für Benutzer {user_dict['username']} zu pbkdf2:sha256")
|
||||||
|
|
||||||
|
# Erstelle neuen Hash mit dem bestätigten Passwort
|
||||||
|
new_hash = generate_password_hash(
|
||||||
|
password,
|
||||||
|
method='pbkdf2:sha256',
|
||||||
|
salt_length=16
|
||||||
|
)
|
||||||
|
|
||||||
|
# Aktualisiere in der Datenbank
|
||||||
|
db = get_db()
|
||||||
|
db.execute('UPDATE user SET password_hash = ? WHERE id = ?',
|
||||||
|
(new_hash, user_dict['id']))
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
return is_valid
|
||||||
|
|
||||||
def user_to_dict(user):
|
def user_to_dict(user):
|
||||||
if not user:
|
if not user:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user