View Source Bcrypt (bcrypt_elixir v3.0.0)
Elixir wrapper for the Bcrypt password hashing function.
For a lower-level API, see Bcrypt.Base.
  
  configuration
  
  Configuration
The following parameter can be set in the config file:
:log_rounds- the computational cost as number of log rounds- the default is 
12(2^12 rounds) 
- the default is 
 
If you are hashing passwords in your tests, it can be useful to add
the following to the config/test.exs file:
# Note: Do not use this value in production
config :bcrypt_elixir, log_rounds: 4
  
  bcrypt
  
  Bcrypt
Bcrypt is a key derivation function for passwords designed by Niels Provos and David Mazières. Bcrypt is an adaptive function, which means that it can be configured to remain slow and resistant to brute-force attacks even as computational power increases.
  
  bcrypt-versions
  
  Bcrypt versions
This bcrypt implementation is based on the latest OpenBSD version, which
fixed a small issue that affected some passwords longer than 72 characters.
By default, it produces hashes with the prefix $2b$, and it can check
hashes with either the $2b$ prefix or the older $2a$ prefix.
It is also possible to generate hashes with the $2a$ prefix by running
the following command:
Bcrypt.Base.hash_password("hard to guess", Bcrypt.Base.gen_salt(12, true))This option should only be used if you need to generate hashes that are then checked by older libraries.
The $2y$ prefix is not supported. For advice on how to use hashes with the
$2y$ prefix, see this issue.
Hash the password with a salt which is randomly generated.
Link to this section Summary
Functions
Hashes a password, using hash_pwd_salt/2, and returns the password hash in a map.
Checks the password, using verify_pass/2, by comparing the hash with
the password hash found in a user struct, or map.
Hashes a password with a randomly generated salt.
Runs the password hash function, but always returns false.
Verifies a password by hashing the password and comparing the hashed value with a stored hash.
Link to this section Functions
Hashes a password, using hash_pwd_salt/2, and returns the password hash in a map.
This is a convenience function that is especially useful when used with Ecto changesets.
  
  options
  
  Options
In addition to the :hash_key option show below, this function also takes
options that are then passed on to the hash_pwd_salt/2 function in this
module.
See the documentation for hash_pwd_salt/2 for further details.
:hash_key- the password hash identifier- the default is 
:password_hash 
- the default is 
 
  
  example-with-ecto
  
  Example with Ecto
The put_pass_hash function below is an example of how you can use
add_hash to add the password hash to the Ecto changeset.
defp put_pass_hash(%Ecto.Changeset{valid?: true, changes:
    %{password: password}} = changeset) do
  change(changeset, add_hash(password))
end
defp put_pass_hash(changeset), do: changesetThis function will return a changeset with %{password_hash: password_hash}
added to the changes map.
Checks the password, using verify_pass/2, by comparing the hash with
the password hash found in a user struct, or map.
This is a convenience function that takes a user struct, or map, as input and seamlessly handles the cases where no user is found.
  
  options
  
  Options
:hash_key- the password hash identifier- this does not need to be set if the key is 
:password_hashor:encrypted_password 
- this does not need to be set if the key is 
 :hide_user- run theno_user_verify/1function if no user is found- the default is true
 
  
  example
  
  Example
The following is an example of using this function to verify a user's password:
def verify_user(%{"password" => password} = params) do
  params
  |> Accounts.get_by()
  |> check_pass(password)
endThe Accounts.get_by function in this example takes the user parameters
(for example, email and password) as input and returns a user struct or nil.
Hashes a password with a randomly generated salt.
  
  option
  
  Option
:log_rounds- the computational cost as number of log rounds- the default is 12 (2^12 rounds)
 - this can be used to override the value set in the config
 
  
  examples
  
  Examples
The following examples show how to hash a password with a randomly-generated salt and then verify a password:
iex> hash = Bcrypt.hash_pwd_salt("password")
...> Bcrypt.verify_pass("password", hash)
true
iex> hash = Bcrypt.hash_pwd_salt("password")
...> Bcrypt.verify_pass("incorrect", hash)
false
  Runs the password hash function, but always returns false.
This function is intended to make it more difficult for any potential attacker to find valid usernames by using timing attacks. This function is only useful if it is used as part of a policy of hiding usernames.
  
  options
  
  Options
This function should be called with the same options as those used by
hash_pwd_salt/2.
  
  hiding-usernames
  
  Hiding usernames
In addition to keeping passwords secret, hiding the precise username can help make online attacks more difficult. An attacker would then have to guess a username / password combination, rather than just a password, to gain access.
This does not mean that the username should be kept completely secret. Adding a short numerical suffix to a user's name, for example, would be sufficient to increase the attacker's work considerably.
If you are implementing a policy of hiding usernames, it is important to make sure that the username is not revealed by any other part of your application.
Verifies a password by hashing the password and comparing the hashed value with a stored hash.
See the documentation for hash_pwd_salt/2 for examples of using this function.