mirror of https://git.48k.eu/ogcp
Add password hashing
The front-end now hashes passwords before sending them to the back-end. It uses SHA-512. This commit adds a hidden input which sends the password hash to not interfere with browsers' save password functionality. Also change passwords of the template configuration file for their hashed/digested versions.multi-ogserver
parent
1f9a3d3b41
commit
c7b0024d24
|
@ -6,12 +6,12 @@
|
|||
"USERS": [
|
||||
{
|
||||
"USER": "admin",
|
||||
"PASS": "pass",
|
||||
"PASS": "5b722b307fce6c944905d132691d5e4a2214b7fe92b738920eb3fce3a90420a19511c3010a0e7712b054daef5b57bad59ecbd93b3280f210578f547f4aed4d25",
|
||||
"SCOPES": [ ]
|
||||
},
|
||||
{
|
||||
"USER": "user",
|
||||
"PASS": "pass",
|
||||
"PASS": "5b722b307fce6c944905d132691d5e4a2214b7fe92b738920eb3fce3a90420a19511c3010a0e7712b054daef5b57bad59ecbd93b3280f210578f547f4aed4d25",
|
||||
"SCOPES": [
|
||||
"Unidad Organizativa (Default)"
|
||||
]
|
||||
|
|
|
@ -21,6 +21,8 @@ class LoginForm(FlaskForm):
|
|||
)
|
||||
pwd = PasswordField(
|
||||
label=_l('Password'),
|
||||
)
|
||||
pwd_hash = HiddenField(
|
||||
validators=[InputRequired()]
|
||||
)
|
||||
submit_btn = SubmitField(
|
||||
|
|
|
@ -207,3 +207,27 @@ function RemovePartition(evt) {
|
|||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function digestMessage(msg) {
|
||||
const msgUint8 = new TextEncoder().encode(msg);
|
||||
const hashBuffer = await crypto.subtle.digest('SHA-512', msgUint8);
|
||||
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
||||
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
||||
return hashHex;
|
||||
}
|
||||
|
||||
function digestLoginPassword() {
|
||||
const loginForm = $('#login-form')
|
||||
loginForm.one('submit', async function (event) {
|
||||
event.preventDefault()
|
||||
|
||||
const pwdInput = $('#pwd');
|
||||
const pwdHashInput = $('#pwd_hash');
|
||||
const pwdStr = pwdInput.val();
|
||||
const pwdStrHash = await digestMessage(pwdStr);
|
||||
|
||||
pwdInput.prop( "disabled", true );
|
||||
pwdHashInput.val(pwdStrHash);
|
||||
$(this).submit()
|
||||
});
|
||||
}
|
||||
|
|
|
@ -15,7 +15,8 @@
|
|||
{{ wtf.quick_form(form,
|
||||
method='post',
|
||||
form_type='basic',
|
||||
button_map={'submit_btn':'primary'}) }}
|
||||
button_map={'submit_btn':'primary'},
|
||||
id='login-form') }}
|
||||
</div>
|
||||
<!-- /.login-card-body -->
|
||||
</div>
|
||||
|
@ -23,5 +24,12 @@
|
|||
<!-- /.login-box -->
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('readystatechange', () => {
|
||||
if (document.readyState === 'complete') {
|
||||
digestLoginPassword()
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
|
|
|
@ -261,7 +261,7 @@ def login():
|
|||
form = LoginForm(request.form)
|
||||
if request.method == 'POST' and form.validate():
|
||||
form_user = request.form['user']
|
||||
pwd = request.form['pwd']
|
||||
pwd = request.form['pwd_hash']
|
||||
user_dict = authenticate_user(form_user, pwd)
|
||||
if not user_dict:
|
||||
return render_template('auth/login.html', form=form)
|
||||
|
|
Loading…
Reference in New Issue