> > There are definitely a fair number of applications that use the above > method to ensure backwards compatibility and a solid upgrade path, and as > such I would be resistant to adding warnings/errors/exceptions here. >
I think Anthony makes a valid point, to preserve BC adding errors / exceptions may not be the best approach by default. However having a third param to password_verify(), that is false by default, that would allow for an exception to be thrown in the event of an unknown algo / bad hash might be a better path forward and would be totally beneficial in my opinion. Thanks Jesse Rushlow On Thu, Jan 28, 2021 at 11:42 AM Anthony Ferrara <ircmax...@gmail.com> wrote: > On Wed, Jan 27, 2021 at 11:27 AM Benjamin Morel <benjamin.mo...@gmail.com> > wrote: > > > Hi internals, > > > > I just spent some time debugging an authentication issue after upgrading > > PHP, and realized that it was due to ext-sodium not being installed, so > > password_verify() would always return false for argon2i hashes. > > > > Digging a bit more, I realized that password_verify() does not complain > if > > the algorithm is unknown, or if the hash string is malformed: > > > > var_export(password_verify('passw0rd', 'any/string%as|a$hash')); // > > false > > > > Shouldn't it throw an exception, or a least trigger a warning, when the > > algorithm is unknown, or the hash is malformed? Returning false IMO, > should > > mean "I recognize this hash, but it doesn't match your password". "I > don't > > recognize this hash" is an application issue and should be reported. > > > > What do you think? > > > > > Hey all, > > I just wanted to drop in and make a note here. When I designed > password_verify, the lack of validation/errors on invalid hases was 100% > explicit and intentional. The primary reason is to support multiple > validation strategies in order to allow for migration paths between > different storage mechanisms. > > Take an example where someone used to use Wordpress's custom phpass based > $P$ system. They now want to migrate to bcrypt/argon/etc. If > password_verify threw errors the validation system would need to introspect > each hash to determine how to validate it (note, this happens in > password_verify and the other validators already). But without errors, it > becomes a simple fallthrough: > > function validate($password, $hash) { > if (password_verify($password, $hash)) return true; > if (legacy_verify($password, $hash) || other_legacy_verify($password, > $hash)) { > update_password_hash($password); > return true; > } > return false; > } > > There are definitely a fair number of applications that use the above > method to ensure backwards compatibility and a solid upgrade path, and as > such I would be resistant to adding warnings/errors/exceptions here. > > The case for "it's an application issue" is definitely valid, though that's > also what password_info was added to provide (it is easy to introspect). > > One other point I'd make is to normally suggest not disclosing any > information about cryptographic material via error handling mechanisms > (it's too easy to expose to attackers). This is one of those dev-x/security > tradeoffs. Does not throwing a warning improve security? Not in most cases. > But can throwing a warning make an attackers job easier (or at least point > them in the right direction)? Perhaps. > > My $0.02 at least > > Anthony > > — Benjamin > > >