line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
our $VERSION = '0.003'; |
2
|
|
|
|
|
|
|
use Moose; |
3
|
1
|
|
|
1
|
|
57175
|
|
|
1
|
|
|
|
|
386975
|
|
|
1
|
|
|
|
|
6
|
|
4
|
|
|
|
|
|
|
# ABSTRACT: An Argon2 implemenation of Password::OWASP |
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
with 'Password::OWASP::AbstractBaseX'; |
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
use Try::Tiny; |
9
|
1
|
|
|
1
|
|
6215
|
|
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
59
|
|
10
|
|
|
|
|
|
|
use Authen::Passphrase::Argon2; |
11
|
1
|
|
|
1
|
|
577
|
|
|
1
|
|
|
|
|
14317
|
|
|
1
|
|
|
|
|
246
|
|
12
|
|
|
|
|
|
|
my ($self, $pass) = @_; |
13
|
|
|
|
|
|
|
|
14
|
2
|
|
|
2
|
1
|
346
|
my $ppr = Authen::Passphrase::Argon2->new( |
15
|
|
|
|
|
|
|
cost => $self->cost, |
16
|
2
|
|
|
|
|
56
|
salt_random => 1, |
17
|
|
|
|
|
|
|
passphrase => $self->hash_password($pass), |
18
|
|
|
|
|
|
|
); |
19
|
|
|
|
|
|
|
return $ppr->as_rfc2307; |
20
|
|
|
|
|
|
|
} |
21
|
2
|
|
|
|
|
903672
|
|
22
|
|
|
|
|
|
|
my ($self, $given, $want) = @_; |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
my $ok = try { |
25
|
6
|
|
|
6
|
1
|
137376
|
my $ppr = Authen::Passphrase::Argon2->from_rfc2307($want); |
26
|
|
|
|
|
|
|
return 1 if $ppr->match($self->hash_password($given)); |
27
|
|
|
|
|
|
|
return 0; |
28
|
6
|
|
|
6
|
|
199
|
}; |
29
|
4
|
100
|
|
|
|
461
|
return 1 if $ok; |
30
|
3
|
|
|
|
|
929014
|
return 1 if $self->check_legacy_password($given, $want); |
31
|
6
|
|
|
|
|
61
|
return 0; |
32
|
6
|
100
|
|
|
|
657361
|
}; |
33
|
5
|
100
|
|
|
|
38
|
|
34
|
2
|
|
|
|
|
22
|
around check_legacy_password => sub { |
35
|
|
|
|
|
|
|
my ($orig, $self, $given, $want) = @_; |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
my $ok = try { |
38
|
|
|
|
|
|
|
my $ppr = Authen::Passphrase::Argon2->from_rfc2307($want); |
39
|
|
|
|
|
|
|
return $ppr->match($given); |
40
|
|
|
|
|
|
|
}; |
41
|
|
|
|
|
|
|
if ($ok) { |
42
|
|
|
|
|
|
|
$self->update_password($given) if $self->has_update_method; |
43
|
|
|
|
|
|
|
return 1; |
44
|
|
|
|
|
|
|
} |
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
return $orig->($self, $given, $want); |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
}; |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
__PACKAGE__->meta->make_immutable; |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
=pod |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
=encoding UTF-8 |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
=head1 NAME |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
Password::OWASP::Argon2 - An Argon2 implemenation of Password::OWASP |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
=head1 VERSION |
62
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
version 0.003 |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
=head1 SYNOPSIS |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
package MyApp::Authentication; |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
use Password::OWASP::Argon2; |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
my $user = get_from_db(); |
72
|
|
|
|
|
|
|
my $from_web = "Super secret password"; |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
my $owasp = Password::OWASP::Argon2->new( |
75
|
|
|
|
|
|
|
# optional |
76
|
|
|
|
|
|
|
hashing => 'sha512', |
77
|
|
|
|
|
|
|
update_method => sub { |
78
|
|
|
|
|
|
|
my $password = shift; |
79
|
|
|
|
|
|
|
$user->update_password($password); |
80
|
|
|
|
|
|
|
return; |
81
|
|
|
|
|
|
|
}, |
82
|
|
|
|
|
|
|
); |
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
if (!$owasp->check_password($from_web)) { |
85
|
|
|
|
|
|
|
die "You cannot login"; |
86
|
|
|
|
|
|
|
} |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
=head1 DESCRIPTION |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
Implements Argon2 password checking. |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
=head1 METHODS |
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
=head2 crypt_password |
95
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
Encrypt the password and return it as an RFC2307 formatted string. |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
=head2 check_password |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
Check if the password is the same as what was stored. |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
=head1 SEE ALSO |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
=over |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
=item * L<Password::OWASP::AbstractBase> |
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
=item * L<Authen::Passphrase::BlowfishCrypt> |
109
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
=back |
111
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
=head1 AUTHOR |
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
Wesley Schwengle <waterkip@cpan.org> |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
=head1 COPYRIGHT AND LICENSE |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
This software is Copyright (c) 2019 by Wesley Schwengle. |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
This is free software, licensed under: |
121
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
The (three-clause) BSD License |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
=cut |