class Crypto::Bcrypt

Overview

Pure Crystal implementation of the Bcrypt algorithm by Niels Provos and David Mazières, as [presented at USENIX in 1999](https://www.usenix.org/legacy/events/usenix99/provos/provos_html/index.html).

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.

This implementation of Bcrypt is currently 50% slower than pure C solutions, so keep this in mind when selecting your cost. It may be wise to test with Ruby's bcrypt gem which is a binding to OpenBSD's implementation.

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.

Defined in:

crypto/bcrypt.cr

Constant Summary

CIPHER_TEXT = Int32[1332899944, 1700884034, 1701343084, 1684370003, 1668446532, 1869963892]

bcrypt IV: "OrpheanBeholderScryDoubt" :nodoc:

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

Class Method Summary

Instance Method Summary

Instance methods inherited from class Reference

==(other)
==(other : self)
==
, hash hash, inspect(io : IO) : Nil inspect, object_id : UInt64 object_id, same?(other : Reference)
same?(other : Nil)
same?
, to_s(io : IO) : Nil to_s

Instance methods inherited from class Object

!=(other) !=, !~(other) !~, ==(other) ==, ===(other)
===(other : YAML::Any)
===(other : JSON::Any)
===
, =~(other) =~, class class, clone clone, crystal_type_id crystal_type_id, dup dup, hash hash, inspect
inspect(io : IO)
inspect
, itself itself, not_nil! not_nil!, tap(&block) tap, to_json to_json, to_pretty_json(io : IO)
to_pretty_json
to_pretty_json
, to_s
to_s(io : IO)
to_s
, to_yaml(io : IO)
to_yaml
to_yaml
, try(&block) try

Class methods inherited from class Object

==(other : Class) ==, ===(other) ===, cast(other) : self cast, from_json(string_or_io) : self from_json, from_yaml(string : String) : self from_yaml, hash hash, inspect(io) inspect, name : String name, to_s(io) to_s, |(other : U.class) |

Class Method Detail

def self.hash_secret(password, cost = DEFAULT_COST) : String #

[View source]
def self.new(password : String, salt : String, cost = DEFAULT_COST) #

[View source]
def self.new(password : Slice(UInt8), salt : Slice(UInt8), cost = DEFAULT_COST) #

[View source]

Instance Method Detail

def cost : Int32 #

[View source]
def digest #

[View source]
def inspect(io) #

[View source]
def password : Slice(UInt8) #

[View source]
def salt : Slice(UInt8) #

[View source]
def to_s #

[View source]
def to_s(io) #

[View source]
def to_slice(*args) #

[View source]