Since v0.5 the passwords are hashed/encrypted in the database.
The encryption methods rely on the Python module PyCrypto:
- the profile password are salted with a random 128 bits long string and hashed with the PBKDF2 algorithm;
- other passwords and the "personal key" are encrypted with the AES-256 symmetric cipher and a 128 bits long initialization vector. CFB (Cipher FeedBack) mode of is used.
As shown in the schema, the profile password is the key to encrypt/decrpyt the "personal key", which is used itself to encrypt/decrypt other passwords. This way, the profile password can be changed without needing to re-encrypt all password, sole the "personal key" needs a re-encryption. This also leave us more flexibility for the future, as we plan to implement a multi-key authentication system similar to what is done in LUKS - e.g. to deliver a single-use password for connection being established from untrusted devices (a public computer in the airport, smartphone of a "friend"...).
Not to be forgotten though: as the profile password unlocks everything, it must be strong to not compromise the safety of the other accounts!
Remark: for now we assume that the connection from a local frontend is trusted and empty profile passwords are accepted. It is not the case for remote frontends like Libervia which forces a minimal length of 6 characters for new account creation. Later we should also generalize this constraint to the remote connections (not only to the remote account creation).