[wp-trac] [WordPress Trac] #39499: Migrate Password Hashing from 8192 rounds of salted MD5 to Argon2i v1.3

WordPress Trac noreply at wordpress.org
Fri Jan 6 08:28:34 UTC 2017


#39499: Migrate Password Hashing from 8192 rounds of salted MD5 to Argon2i v1.3
------------------------------------------+-----------------------------
 Reporter:  paragoninitiativeenterprises  |      Owner:
     Type:  enhancement                   |     Status:  new
 Priority:  normal                        |  Milestone:  Awaiting Review
Component:  Security                      |    Version:  trunk
 Severity:  normal                        |   Keywords:
  Focuses:                                |
------------------------------------------+-----------------------------
 This is a sibling ticket to #39309 to greatly enhance the security of
 WordPress blogs the whole world over. It is not a duplicate of #21022 as
 that pertains to bcrypt.

 Currently, WordPress uses 8192 rounds of Salted MD5 for password hashing:
 https://paragonie.com/blog/2016/08/on-insecurity-popular-open-source-php-
 cms-platforms#wordpress-password-storage

 Salted MD5 is a weaker version of PBKDF2-MD5 with a low number of
 iterations and no GPU resistance. Migrating to bcrypt has been proposed
 (see #21022 for details), but bcrypt support in PHP < 5.3.7 isn't
 consistent; nor is it secure.

 = Proposal: Switch to Argon2i for Password Hashing =

 Argon2i is available in libsodium, accessible via the `crypto_pwhash` API.

 Paragon Initiative Enterprises is currently developing a pure-PHP polyfill
 for the libsodium extension (currently available in PECL) compatible with
 PHP 5.2.4+. Once it's complete, stable, and independently audited by third
 party security experts, WordPress should consider adopting this library to
 facilitate a long-overdue security enhancement.

 Our library is available on Github:
 https://github.com/paragonie/sodium_compat

 == Migrating Legacy Hashes ==

 We recommend the process outlined here: https://paragonie.com/blog/2016/02
 /how-safely-store-password-in-2016#legacy-hashes

 In more WP-specific terms: On the next automatic update, immediately re-
 hash all users' password hashes with Argon2i. Store the old **salt** (not
 the full hash) alongside the Argon2i hash, and provide some way of
 identifying legacy hashes.

 When a user authenticates:

 * Is this a legacy hash?
   * Pre-hash with Phpass (in portable mode, as per WordPress today)
   * Use the $P$ hash as the password for `crypto_pwhash_str_verify()`
   * If the password validates, calculate a new `crypto_pwhash_str()` of
 the user's given password and store that in the database. Clear the old
 salt and any legacy password indicators.
 * Otherwise, just use `crypto_pwhash_str_verify()`

 WordPress should absolutely NOT consider an "opportunistic upgrade"
 strategy. Otherwise, you're no better than Yahoo:
 https://nakedsecurity.sophos.com/2016/12/15/yahoo-breach-ive-closed-my-
 account-because-it-uses-md5-to-hash-my-password/

--
Ticket URL: <https://core.trac.wordpress.org/ticket/39499>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list