Skip to content

Commit 9e3564e

Browse files
Make password hashing parameters configurable
1 parent 6d44e6d commit 9e3564e

File tree

8 files changed

+60
-10
lines changed

8 files changed

+60
-10
lines changed

bin/hash_db_password.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@
3838

3939
for user in users:
4040
log.info("Hashing password for {0}".format(user.username))
41-
user.password = generate_password_hash(user.password)
41+
user.password = generate_password_hash(
42+
password=user.password,
43+
method=app.config.get('FAB_PASSWORD_HASH_METHOD', 'scrypt'),
44+
salt_length=app.config.get('FAB_PASSWORD_HASH_SALT_LENGTH', 16),
45+
)
4246
try:
4347
db.session.merge(user)
4448
db.session.commit()

docs/config.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,16 @@ Use config.py to configure the following parameters. By default it will use SQLL
325325
| | validation for AUTH database users. | No |
326326
| | Default is False. | |
327327
+----------------------------------------+--------------------------------------------+-----------+
328+
| FAB_PASSWORD_HASH_METHOD | Sets the password hashing method. For the | |
329+
| | supported parameters see | |
330+
| | `generate_password_hash`_. | No |
331+
| | Default: ``'scrypt'``. | |
332+
+----------------------------------------+--------------------------------------------+-----------+
333+
| FAB_PASSWORD_HASH_SALT_LENGTH | Sets the password hashing salt length. | No |
334+
| | Default: ``16``. | |
335+
+----------------------------------------+--------------------------------------------+-----------+
336+
337+
.. _generate_password_hash: https://werkzeug.palletsprojects.com/en/stable/utils/#werkzeug.security.generate_password_hash
328338

329339
Note
330340
----

flask_appbuilder/security/manager.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -950,7 +950,11 @@ def reset_password(self, userid, password):
950950
The clear text password to reset and save hashed on the db
951951
"""
952952
user = self.get_user_by_id(userid)
953-
user.password = generate_password_hash(password)
953+
user.password = generate_password_hash(
954+
password=password,
955+
method=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_METHOD', 'scrypt'),
956+
salt_length=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_SALT_LENGTH', 16),
957+
)
954958
self.update_user(user)
955959

956960
def update_user_auth_stat(self, user, success=True):

flask_appbuilder/security/mongoengine/manager.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,11 @@ def add_register_user(
9494
if hashed_password:
9595
register_user.password = hashed_password
9696
else:
97-
register_user.password = generate_password_hash(password)
97+
register_user.password = generate_password_hash(
98+
password=password,
99+
method=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_METHOD', 'scrypt'),
100+
salt_length=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_SALT_LENGTH', 16),
101+
)
98102
register_user.registration_hash = str(uuid.uuid1())
99103
register_user.save()
100104
return register_user
@@ -141,7 +145,11 @@ def add_user(
141145
if hashed_password:
142146
user.password = hashed_password
143147
else:
144-
user.password = generate_password_hash(password)
148+
user.password = generate_password_hash(
149+
password=password,
150+
method=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_METHOD', 'scrypt'),
151+
salt_length=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_SALT_LENGTH', 16),
152+
)
145153
user.save()
146154
log.info(c.LOGMSG_INF_SEC_ADD_USER, username)
147155
return user

flask_appbuilder/security/sqla/apis/user/api.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,18 @@ def pre_update(self, item):
6969
item.changed_on = datetime.now()
7070
item.changed_by_fk = g.user.id
7171
if item.password:
72-
item.password = generate_password_hash(item.password)
72+
item.password = generate_password_hash(
73+
password=item.password,
74+
method=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_METHOD', 'scrypt'),
75+
salt_length=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_SALT_LENGTH', 16),
76+
)
7377

7478
def pre_add(self, item):
75-
item.password = generate_password_hash(item.password)
79+
item.password = generate_password_hash(
80+
password=item.password,
81+
method=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_METHOD', 'scrypt'),
82+
salt_length=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_SALT_LENGTH', 16),
83+
)
7684

7785
@expose("/", methods=["POST"])
7886
@protect()

flask_appbuilder/security/sqla/manager.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,11 @@ def add_register_user(
141141
if hashed_password:
142142
register_user.password = hashed_password
143143
else:
144-
register_user.password = generate_password_hash(password)
144+
register_user.password = generate_password_hash(
145+
password=password,
146+
method=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_METHOD', 'scrypt'),
147+
salt_length=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_SALT_LENGTH', 16),
148+
)
145149
register_user.registration_hash = str(uuid.uuid1())
146150
try:
147151
self.get_session.add(register_user)
@@ -234,7 +238,11 @@ def add_user(
234238
if hashed_password:
235239
user.password = hashed_password
236240
else:
237-
user.password = generate_password_hash(password)
241+
user.password = generate_password_hash(
242+
password=password,
243+
method=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_METHOD', 'scrypt'),
244+
salt_length=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_SALT_LENGTH', 16),
245+
)
238246
self.get_session.add(user)
239247
self.get_session.commit()
240248
log.info(c.LOGMSG_INF_SEC_ADD_USER, username)

flask_appbuilder/security/views.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,11 @@ def pre_update(self, item: Any) -> None:
446446
item.changed_by_fk = g.user.id
447447

448448
def pre_add(self, item: Any) -> None:
449-
item.password = generate_password_hash(item.password)
449+
item.password = generate_password_hash(
450+
password=item.password,
451+
method=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_METHOD', 'scrypt'),
452+
salt_length=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_SALT_LENGTH', 16),
453+
)
450454

451455

452456
class UserStatsChartView(DirectByChartView):

tests/test_security_api.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ def _create_test_user(
5151
user.username = username
5252
user.email = email
5353
user.roles = roles
54-
user.password = generate_password_hash(password)
54+
user.password = generate_password_hash(
55+
password=password,
56+
method=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_METHOD', 'scrypt'),
57+
salt_length=self.appbuilder.get_app.config.get('FAB_PASSWORD_HASH_SALT_LENGTH', 16),
58+
)
5559
self.session.commit()
5660
return user
5761

0 commit comments

Comments
 (0)