class

Crypto::Bcrypt

Inherits Reference / Object

Pure Crystal implementation of the Bcrypt algorithm by Niels Provos and David Mazières, as presented at USENIX in 1999.

The algorithm has a maximum password length limit of 71 characters (see this comment on stackoverflow).

Refer to Crypto::Bcrypt::Password for a higher level interface.

About the Cost

Bcrypt, like the PBKDF2 or scrypt ciphers, are designed to be slow, so generating rainbow tables or cracking passwords is nearly impossible. Yet, computers are always getting faster and faster, so the actual cost must be incremented every once in a while. Always use the maximum cost that is tolerable, performance wise, for your application. Be sure to test and select this based on your server, not your home computer.

Last but not least: beware of denial of services! Always protect your application using an external strategy (eg: rate limiting), otherwise endpoints that verifies bcrypt hashes will be an easy target.

NOTE: To use Bcrypt, you must explicitly import it with require "crypto/bcrypt"

Constants

COST_RANGE = 4..31
DEFAULT_COST = 11
PASSWORD_RANGE = 1..72
SALT_SIZE = 16

Constructors

new(password : String, salt : String, cost : Int32 = DEFAULT_COST) : self

Creates a new Crypto::Bcrypt object from the given password with salt and cost.

salt must be a base64 encoded string of 16 bytes (128 bits).

require "crypto/bcrypt"

password = Crypto::Bcrypt.new "secret", "CJjskaIgXR32DJYjVyNPdA=="
password.to_s # => "$2a$11$CJjskaIgXR32DJYjVyNPd./ajV3Yj6GiP0IAI6rR.fMnjRgozqqqG"
Source
new(password : Bytes, salt : Bytes, cost : Int32 = DEFAULT_COST)

Creates a new Crypto::Bcrypt object from the given password with salt in bytes and cost.

require "crypto/bcrypt"

password = Crypto::Bcrypt.new "secret".to_slice, "salt_of_16_chars".to_slice
password.digest
Source

Class methods

hash_secret(password : String, cost : Int32 = DEFAULT_COST) : String

Hashes the password using bcrypt algorithm using salt obtained via Random::Secure.random_bytes(SALT_SIZE).

require "crypto/bcrypt"

Crypto::Bcrypt.hash_secret "secret"
Source

Instance methods

cost
Source
digest
Source
inspect(io : IO) : Nil

Appends a String representation of this object which includes its class name, its object address and the values of all instance variables.

class Person
  def initialize(@name : String, @age : Int32)
  end
end

Person.new("John", 32).inspect # => #<Person:0x10fd31f20 @name="John", @age=32>
Source
password
Source
salt
Source
to_s(io : IO) : Nil

Appends a short String representation of this object which includes its class name and its object address.

class Person
  def initialize(@name : String, @age : Int32)
  end
end

Person.new("John", 32).to_s # => #<Person:0x10a199f20>
Source
to_s

Returns a nicely readable and concise string representation of this object, typically intended for users.

This method should usually not be overridden. It delegates to #to_s(IO) which can be overridden for custom implementations.

Also see #inspect.

Source
to_slice(*args, **options)
Source
to_slice(*args, **options, &)
Source

Nested types