Pretty much, yes. PBKDF2 is a well-established algorithm, and os.urandom
is a suitable CSPRNG
that can be used in salt generation on all major platforms (patched, of course).
Your implementation is also brutally simple. The simpler a system, the more secure it can be. Needless complexity leads to insecurities.
So yes, the system is secure, but it is also subject to Moore's law, just like every other computer system or piece of software. To get around this, the number of rounds (iterations) in strong encryption algorithms is a variable taken into account.
In bcrypt, for example, the number of rounds is 2^workload
(default 12), and in PBKDF2 the number of rounds is an int passed to the function. Beware that if you need to use a Cython interface, your password hashing is a strongly blocking call (this has bitten me before)
password = '1000:' + PBKDF2(passphrase, salt, 1000).read(32).encode('hex')
. That way you can increase the difficulty parameter as computers get faster and upgrade old users' hashes when they log in. \$\endgroup\$