# NAME

Digest::Bcrypt [![Build Status](https://travis-ci.org/genio/digest-bcrypt.svg?branch=master)](https://travis-ci.org/genio/digest-bcrypt)

## SYNOPSIS

```perl
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Digest;   # via the Digest module (recommended)

my $bcrypt = Digest->new('Bcrypt', cost => 12, salt => 'abcdefgh♥stuff');

# $cost is an integer between 1 and 31
$bcrypt->cost(12);

# $salt must be exactly 16 octets long
$bcrypt->salt('abcdefgh♥stuff');

$bcrypt->add('some stuff', 'here and', 'here');

my $digest = $bcrypt->digest;
$digest = $bcrypt->hexdigest;
$digest = $bcrypt->b64digest;

# bcrypt's own non-standard base64 dictionary
$digest = $bcrypt->bcrypt_b64digest;
```

## NOTICE

While maintenance for [Digest::Bcrypt](https://github.com/genio/digest-bcrypt/) will continue, there's no reason to use
[Digest::Bcrypt](https://github.com/genio/digest-bcrypt/) when [Crypt::Eksblowfish::Bcrypt](https://metacpan.org/pod/Crypt::Eksblowfish::Bcrypt) already exists.  We suggest
that you use [Crypt::Eksblowfish::Bcrypt](https://metacpan.org/pod/Crypt::Eksblowfish::Bcrypt) instead.

## DESCRIPTION

[Digest::Bcrypt](https://github.com/genio/digest-bcrypt/) provides a [Digest](https://metacpan.org/pod/Digest)-based interface to the
[Crypt::Eksblowfish::Bcrypt](https://metacpan.org/pod/Crypt::Eksblowfish::Bcrypt) library.

Please note that you ``must`` set a [salt](#salt) of exactly 16 octets in length,
and you ``must`` provide a [cost](#cost) in the range ```[1,31]```.

## ATTRIBUTES
[Digest::Bcrypt](https://github.com/genio/digest-bcrypt/) implements the following attributes.

### cost

```perl
$bcrypt = $bcrypt->cost($cost); # allows for method chaining
my $cost = $bcrypt->cost();
```

An integer in the range ```[1,31]```, this is required.

See [Crypt::Eksblowfish::Bcrypt](https://metacpan.org/module/Crypt::Eksblowfish::Bcrypt) for a
detailed description of [cost](https://metacpan.org/pod/Crypt::Eksblowfish::Bcrypt#cost)
in the context of the [bcrypt algorithm](http://usenix.org/legacy/publications/library/proceedings/usenix99/full_papers/provos/provos_html/node5.html).

When called with no arguments, it will return the current cost.

### salt

```perl
$bcrypt = $bcrypt->salt($salt); # allows for method chaining
my $salt = $bcrypt->salt();
```

Sets the value to be used as a salt. Bcrypt requires __exactly__ 16 octets of salt

It is recommenced that you use a module like [Data::Entropy::Algorithms](https://metacpan.org/module/Data::Entropy::Algorithms) to
provide a truly randomized salt.

When called with no arguments, it will return whatever is the current salt.

## METHODS

[Digest::Bcrypt](https://github.com/genio/digest-bcrypt/) inherits all methods
from [Digest::base](https://metacpan.org/pod/Digest::base) and implements/overrides
the following methods as well.

### new

```perl
my $bcrypt = Digest->new('Bcrypt', %params);
my $bcrypt = Digest::Bcrypt->new(%params);
my $bcrypt = Digest->new('Bcrypt', \%params);
my $bcrypt = Digest::Bcrypt->new(\%params);
```

Creates a new [Digest::Bcrypt](https://github.com/genio/digest-bcrypt/) object.
It is recommended that you use the [Digest](https://metacpan.org/pod/Digest)
module in the first example rather than using
[Digest::Bcrypt](https://github.com/genio/digest-bcrypt/) directly.

Possible parameters are:

* cost - an integer between 1 and 31
* salt - a string of exatcly 16 octets in length

### add

```perl
    $bcrypt->add("a"); $bcrypt->add("b"); $bcrypt->add("c");
    $bcrypt->add("a")->add("b")->add("c");
    $bcrypt->add("a", "b", "c");
    $bcrypt->add("abc");
```

Adds data to the message we are calculating the digest for. All the above
examples have the same effect.

### b64digest

```perl
my $digest = $bcrypt->b64digest;
```

Same as [digest](#digest), but will return the digest base64 encoded.

The ```length``` of the returned string will be 31 and will only contain characters
from the ranges ```[0,9]```, ```[A,Z]```, ```[a,z]```, ```+```, and ```/```.

The base64 encoded string returned is not padded to be a multiple of 4 bytes long.

### bcrypt_b64digest

```perl
my $digest = $bcrypt->bcrypt_b64digest;
```

Same as [digest](#digest), but will return the digest base64 encoded using the alphabet
that is commonly used with bcrypt.

The ```length``` of the returned string will be 31 and will only contain characters
from the ranges ```[0,9]```, ```[A,Z]```, ```[a,z]```, ```+```, and ```.```.

The base64 encoded string returned is not padded to be a multiple of 4 bytes long.

_Note:_ This is bcrypt's own non-standard base64 alphabet, It is __not__
compatible with the standard [MIME::base64](https://metacpan.org/pod/MIME::Base64) encoding.

### clone

```perl
my $clone = $bcrypt->clone;
```

Creates a clone of the [Digest::Bcrypt](https://github.com/genio/digest-bcrypt/)
object and returns it.

### digest

```perl
my $digest = $bcrypt->digest;
```

Returns the binary digest for the message. The returned string will be 23 bytes long.

### hexdigest

```perl
my $digest = $bcrypt->hexdigest;
```

Same as [digest](#digest), but will return the digest in hexadecimal form.

The `length` of the returned string will be 46 and will only contain
characters in ```[0-9a-f]```.

### reset

```perl
$bcrypt->reset;
```

Resets the object to the same internal state it was in when it was constructed.

## SEE ALSO

[Digest](https://metacpan.org/module/Digest), [Crypt::Eksblowfish::Bcrypt](https://metacpan.org/module/Crypt::Eksblowfish::Bcrypt), [Data::Entropy::Algorithms](https://metacpan.org/module/Data::Entropy::Algorithms)

## AUTHOR

James Aitken - jaitken@cpan.org

## CONTRIBUTORS

Chase Whitener - capoeirab@cpan.org


## COPYRIGHT AND LICENSE

This software is copyright (c) 2012 by James Aitken.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
