MediaWiki  master
Password Class Reference

Represents a password hash for use in authentication. More...

Inheritance diagram for Password:
Collaboration diagram for Password:

Public Member Functions

 __construct (PasswordFactory $factory, array $config, $hash=null)
 Construct the Password object using a string hash. More...
 
 crypt ( $password)
 Hash a password and store the result in this object. More...
 
 equals ( $other)
 Compare one Password object to this object. More...
 
 getType ()
 Get the type name of the password. More...
 
 needsUpdate ()
 Determine if the hash needs to be updated. More...
 
 toString ()
 Convert this hash to a string that can be stored in the database. More...
 
 verify ( $password)
 Checks whether the given password matches the hash stored in this object. More...
 

Public Attributes

const MAX_HASH_SIZE = 255
 Hash must fit in user_password, which is a tinyblob. More...
 

Protected Member Functions

 assertIsSafeSize ( $hash)
 Assert that hash will fit in a tinyblob field. More...
 
 isSupported ()
 Whether current password type is supported on this system. More...
 
 parseHash ( $hash)
 Perform any parsing necessary on the hash to see if the hash is valid and/or to perform logic for seeing if the hash needs updating. More...
 

Protected Attributes

array $config
 Array of configuration variables injected from the constructor. More...
 
PasswordFactory $factory
 Factory that created the object. More...
 
string $hash
 String representation of the hash without the type. More...
 

Detailed Description

Represents a password hash for use in authentication.

Note: All password types are transparently prefixed with :<TYPE>:, where <TYPE> is the registered type of the hash. This prefix is stripped in the constructor and is added back in the toString() function.

When inheriting this class, there are a couple of expectations to be fulfilled:

  • If Password::toString() is called on an object, and the result is passed back in to PasswordFactory::newFromCiphertext(), the result will be identical to the original. With these two points in mind, when creating a new Password sub-class, there are some functions you have to override (because they are abstract) and others that you may want to override.

The abstract functions that must be overridden are:

  • Password::crypt(), which takes a plaintext password and hashes it into a string hash suitable for being passed to the constructor of that class, and then stores that hash (and whatever other data) into the internal state of the object. The functions that can optionally be overridden are:
  • Password::parseHash(), which can be useful to override if you need to extract values from or otherwise parse a password hash when it's passed to the constructor.
  • Password::needsUpdate(), which can be useful if a specific password hash has different logic for when the hash needs to be updated.
  • Password::toString(), which can be useful if the hash was changed in the constructor and needs to be re-assembled before being returned as a string. This function is expected to add the type back on to the hash, so make sure to do that if you override the function.
  • Password::verify() - This function checks if $this->hash was generated with the given password. The default is to just hash the password and do a timing-safe string comparison with $this->hash.

After creating a new password hash type, it can be registered using the static Password::register() method. The default type is set using the Password::setDefaultType() type. Types must be registered before they can be set as the default.

Since
1.24

Definition at line 61 of file Password.php.

Constructor & Destructor Documentation

◆ __construct()

Password::__construct ( PasswordFactory  $factory,
array  $config,
  $hash = null 
)
final

Construct the Password object using a string hash.

It is strongly recommended not to call this function directly unless you have a reason to. Use the PasswordFactory class instead.

Exceptions
MWExceptionIf $config does not contain required parameters
Parameters
PasswordFactory$factoryFactory object that created the password
array$configArray of engine configuration options for hashing
string | null$hashThe raw hash, including the type

Definition at line 96 of file Password.php.

References $config, $factory, $hash, isSupported(), and parseHash().

Member Function Documentation

◆ assertIsSafeSize()

Password::assertIsSafeSize (   $hash)
finalprotected

Assert that hash will fit in a tinyblob field.

This prevents MW from inserting it into the DB and having MySQL silently truncating it, locking the user out of their account.

Parameters
string$hashThe hash in question.
Exceptions
PasswordErrorIf hash does not fit in DB.

Definition at line 218 of file Password.php.

References crypt().

Referenced by ParameterizedPassword\toString(), Argon2Password\toString(), and toString().

◆ crypt()

Password::crypt (   $password)
abstract

Hash a password and store the result in this object.

The result of the password hash should be put into the internal state of the hash object.

Parameters
string$passwordPassword to hash
Exceptions
PasswordErrorIf an internal error occurs in hashing

Referenced by assertIsSafeSize(), and LayeredParameterizedPassword\partialCrypt().

◆ equals()

Password::equals (   $other)

Compare one Password object to this object.

By default, do a timing-safe string comparison on the result of Password::toString() for each object. This can be overridden to do custom comparison, but it is not recommended unless necessary.

Deprecated:
since 1.33, use verify()
Parameters
Password | string$otherThe other password
Returns
bool True if equal, false otherwise

Definition at line 163 of file Password.php.

References toString(), verify(), and wfDeprecated().

◆ getType()

Password::getType ( )
final

Get the type name of the password.

Returns
string Password type

Definition at line 120 of file Password.php.

Referenced by PasswordFactory\needsUpdate().

◆ isSupported()

Password::isSupported ( )
protected

Whether current password type is supported on this system.

Returns
bool

Definition at line 129 of file Password.php.

Referenced by __construct().

◆ needsUpdate()

Password::needsUpdate ( )
abstract

Determine if the hash needs to be updated.

Returns
bool True if needs update, false otherwise

Referenced by PasswordFactory\needsUpdate(), and parseHash().

◆ parseHash()

Password::parseHash (   $hash)
protected

Perform any parsing necessary on the hash to see if the hash is valid and/or to perform logic for seeing if the hash needs updating.

Parameters
string$hashThe hash, with the :<TYPE>: prefix stripped
Exceptions
PasswordErrorIf there is an error in parsing the hash

Definition at line 140 of file Password.php.

References needsUpdate().

Referenced by __construct().

◆ toString()

Password::toString ( )

Convert this hash to a string that can be stored in the database.

The resulting string should be considered the seralized representation of this hash, i.e., if the return value were recycled back into PasswordFactory::newFromCiphertext, the returned object would be equivalent to this; also, if two objects return the same value from this function, they are considered equivalent.

Returns
string
Exceptions
PasswordErrorif password cannot be serialized to fit a tinyblob.

Definition at line 202 of file Password.php.

References $hash, and assertIsSafeSize().

Referenced by equals(), and verify().

◆ verify()

Password::verify (   $password)

Checks whether the given password matches the hash stored in this object.

Parameters
string$passwordPassword to check
Returns
bool

Definition at line 179 of file Password.php.

References toString().

Referenced by equals().

Member Data Documentation

◆ $config

array Password::$config
protected

Array of configuration variables injected from the constructor.

Definition at line 77 of file Password.php.

Referenced by __construct().

◆ $factory

PasswordFactory Password::$factory
protected

Factory that created the object.

Definition at line 65 of file Password.php.

Referenced by __construct().

◆ $hash

◆ MAX_HASH_SIZE

const Password::MAX_HASH_SIZE = 255

Hash must fit in user_password, which is a tinyblob.

Definition at line 82 of file Password.php.


The documentation for this class was generated from the following file: