Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
syncEnrollments
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Yeray Santana Hualde
syncEnrollments
Commits
bcb6f189
Commit
bcb6f189
authored
Oct 09, 2011
by
Taylor Otwell
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactored bcrypt hashing engine.
parent
92ecae3d
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
103 additions
and
306 deletions
+103
-306
aliases.php
application/config/aliases.php
+1
-1
core.php
laravel/bootstrap/core.php
+9
-1
functions.php
laravel/bootstrap/functions.php
+0
-16
container.php
laravel/config/container.php
+0
-5
container.php
laravel/container.php
+2
-2
hasher.php
laravel/security/hasher.php
+64
-0
bcrypt.php
laravel/security/hashing/bcrypt.php
+0
-254
engine.php
laravel/security/hashing/engine.php
+0
-22
str.php
laravel/str.php
+27
-5
No files found.
application/config/aliases.php
View file @
bcb6f189
...
...
@@ -31,7 +31,7 @@ return array(
'Eloquent'
=>
'Laravel\\Database\\Eloquent\\Model'
,
'File'
=>
'Laravel\\File'
,
'Form'
=>
'Laravel\\Form'
,
'Hasher'
=>
'Laravel\\
Facades
\\Hasher'
,
'Hasher'
=>
'Laravel\\
Security
\\Hasher'
,
'HTML'
=>
'Laravel\\HTML'
,
'Inflector'
=>
'Laravel\\Inflector'
,
'Input'
=>
'Laravel\\Input'
,
...
...
laravel/bootstrap/core.php
View file @
bcb6f189
...
...
@@ -87,4 +87,12 @@ Loader::$aliases = Config::get('aliases');
/**
* Define a few convenient global functions.
*/
require
'functions'
.
EXT
;
\ No newline at end of file
function
e
(
$value
)
{
return
HTML
::
entities
(
$value
);
}
function
__
(
$key
,
$replacements
=
array
(),
$language
=
null
)
{
return
Lang
::
line
(
$key
,
$replacements
,
$language
);
}
\ No newline at end of file
laravel/bootstrap/functions.php
deleted
100644 → 0
View file @
92ecae3d
<?php
function
fe
(
$function
)
{
return
function_exists
(
$function
);
}
function
e
(
$value
)
{
return
HTML
::
entities
(
$value
);
}
function
__
(
$key
,
$replacements
=
array
(),
$language
=
null
)
{
return
Lang
::
line
(
$key
,
$replacements
,
$language
);
}
\ No newline at end of file
laravel/config/container.php
View file @
bcb6f189
...
...
@@ -2,11 +2,6 @@
return
array
(
'laravel.hasher'
=>
array
(
'singleton'
=>
true
,
'resolver'
=>
function
(
$c
)
{
return
new
Security\Hashing\Bcrypt
(
8
,
false
);
}),
/*
|--------------------------------------------------------------------------
| Laravel Routing Components
...
...
laravel/container.php
View file @
bcb6f189
...
...
@@ -135,13 +135,13 @@ class Container {
*
* <code>
* // Resolve the "laravel.router" class from the container
* $input = IoC::container()->core('
input
');
* $input = IoC::container()->core('
router
');
*
* // Equivalent resolution using the "resolve" method
* $input = IoC::container()->resolve('laravel.router');
*
* // Pass an array of parameters to the resolver
* $input = IoC::container()->core('
input
', array('test'));
* $input = IoC::container()->core('
router
', array('test'));
* </code>
*
* @param string $name
...
...
laravel/security/hasher.php
0 → 100644
View file @
bcb6f189
<?php
namespace
Laravel\Security
;
use
Laravel\Str
;
class
Hasher
{
/**
* Hash a password using the Bcrypt hashing scheme.
*
* Bcrypt provides a future-proof hashing algorithm by allowing the number of "rounds"
* to be increased, thus increasing the time is takes to generate the hashed value.
* The longer is takes to generate the hash, the more impractical a rainbow table
* attack against the hashes becomes.
*
* <code>
* // Create a Bcrypt hash of a value
* $hash = Hasher::hash('secret');
*
* // Use a specified number of iterations when creating the hash
* $hash = Hasher::hash('secret', 12);
* </code>
*
* @param string $value
* @param int $rounds
* @return string
*/
public
static
function
hash
(
$value
,
$rounds
=
8
)
{
return
crypt
(
$value
,
'$2a$'
.
str_pad
(
$rounds
,
2
,
'0'
,
STR_PAD_LEFT
)
.
'$'
.
static
::
salt
());
}
/**
* Determine if an unhashed value matches a given Bcrypt hash.
*
* Since the number of rounds is included in the Bcrypt hash, it is not
* necessary to specify the rounds when calling this method.
*
* @param string $value
* @param string $hash
* @return bool
*/
public
static
function
check
(
$value
,
$hash
)
{
return
crypt
(
$value
,
$hash
)
===
$hash
;
}
/**
* Get a salt for use during Bcrypt hashing.
*
* @return string
*/
protected
static
function
salt
()
{
// If OpenSSL is installed, we will use it to gather random bytes for generating
// the salt value. Otherwise, we will use the Str::random method. Bcrypt expects
// the salt to be a 22 character alpha-numeric string. The salt may also contain
// dots, plus signs, and forward slashes.
if
(
function_exists
(
'openssl_random_pseudo_bytes'
))
{
return
substr
(
strtr
(
base64_encode
(
openssl_random_pseudo_bytes
(
16
)),
'+'
,
'.'
),
0
,
22
);
}
return
substr
(
str_replace
(
'+'
,
'.'
,
base64_encode
(
Str
::
random
(
40
))),
0
,
22
);
}
}
\ No newline at end of file
laravel/security/hashing/bcrypt.php
deleted
100644 → 0
View file @
92ecae3d
<?php
namespace
Laravel\Security\Hashing
;
//
// Portable PHP password hashing framework.
//
// Version 0.3 / genuine.
//
// Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in
// the public domain. Revised in subsequent years, still public domain.
//
// There's absolutely no warranty.
//
// The homepage URL for this framework is:
//
// http://www.openwall.com/phpass/
//
// Please be sure to update the Version line if you edit this file in any way.
// It is suggested that you leave the main version number intact, but indicate
// your project name (after the slash) and add your own revision information.
//
// Please do not change the "private" password hashing method implemented in
// here, thereby making your hashes incompatible. However, if you must, please
// change the hash type identifier (the "$P$") to something different.
//
// Obviously, since this code is in the public domain, the above are not
// requirements (there can be none), but merely suggestions.
//
class
Bcrypt
implements
Engine
{
var
$itoa64
;
var
$iteration_count_log2
;
var
$portable_hashes
;
var
$random_state
;
public
function
__construct
(
$iteration_count_log2
,
$portable_hashes
)
{
$this
->
itoa64
=
'./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
;
if
(
$iteration_count_log2
<
4
||
$iteration_count_log2
>
31
)
$iteration_count_log2
=
8
;
$this
->
iteration_count_log2
=
$iteration_count_log2
;
$this
->
portable_hashes
=
$portable_hashes
;
$this
->
random_state
=
microtime
();
if
(
function_exists
(
'getmypid'
))
$this
->
random_state
.=
getmypid
();
}
protected
function
get_random_bytes
(
$count
)
{
$output
=
''
;
if
(
is_readable
(
'/dev/urandom'
)
&&
(
$fh
=
@
fopen
(
'/dev/urandom'
,
'rb'
)))
{
$output
=
fread
(
$fh
,
$count
);
fclose
(
$fh
);
}
if
(
strlen
(
$output
)
<
$count
)
{
$output
=
''
;
for
(
$i
=
0
;
$i
<
$count
;
$i
+=
16
)
{
$this
->
random_state
=
md5
(
microtime
()
.
$this
->
random_state
);
$output
.=
pack
(
'H*'
,
md5
(
$this
->
random_state
));
}
$output
=
substr
(
$output
,
0
,
$count
);
}
return
$output
;
}
protected
function
encode64
(
$input
,
$count
)
{
$output
=
''
;
$i
=
0
;
do
{
$value
=
ord
(
$input
[
$i
++
]);
$output
.=
$this
->
itoa64
[
$value
&
0x3f
];
if
(
$i
<
$count
)
$value
|=
ord
(
$input
[
$i
])
<<
8
;
$output
.=
$this
->
itoa64
[(
$value
>>
6
)
&
0x3f
];
if
(
$i
++
>=
$count
)
break
;
if
(
$i
<
$count
)
$value
|=
ord
(
$input
[
$i
])
<<
16
;
$output
.=
$this
->
itoa64
[(
$value
>>
12
)
&
0x3f
];
if
(
$i
++
>=
$count
)
break
;
$output
.=
$this
->
itoa64
[(
$value
>>
18
)
&
0x3f
];
}
while
(
$i
<
$count
);
return
$output
;
}
protected
function
gensalt_private
(
$input
)
{
$output
=
'$P$'
;
$output
.=
$this
->
itoa64
[
min
(
$this
->
iteration_count_log2
+
((
PHP_VERSION
>=
'5'
)
?
5
:
3
),
30
)];
$output
.=
$this
->
encode64
(
$input
,
6
);
return
$output
;
}
protected
function
crypt_private
(
$password
,
$setting
)
{
$output
=
'*0'
;
if
(
substr
(
$setting
,
0
,
2
)
==
$output
)
$output
=
'*1'
;
$id
=
substr
(
$setting
,
0
,
3
);
# We use "$P$", phpBB3 uses "$H$" for the same thing
if
(
$id
!=
'$P$'
&&
$id
!=
'$H$'
)
return
$output
;
$count_log2
=
strpos
(
$this
->
itoa64
,
$setting
[
3
]);
if
(
$count_log2
<
7
||
$count_log2
>
30
)
return
$output
;
$count
=
1
<<
$count_log2
;
$salt
=
substr
(
$setting
,
4
,
8
);
if
(
strlen
(
$salt
)
!=
8
)
return
$output
;
// We're kind of forced to use MD5 here since it's the only
// cryptographic primitive available in all versions of PHP
// currently in use. To implement our own low-level crypto
// in PHP would result in much worse performance and
// consequently in lower iteration counts and hashes that are
// quicker to crack (by non-PHP code).
if
(
PHP_VERSION
>=
'5'
)
{
$hash
=
md5
(
$salt
.
$password
,
TRUE
);
do
{
$hash
=
md5
(
$hash
.
$password
,
TRUE
);
}
while
(
--
$count
);
}
else
{
$hash
=
pack
(
'H*'
,
md5
(
$salt
.
$password
));
do
{
$hash
=
pack
(
'H*'
,
md5
(
$hash
.
$password
));
}
while
(
--
$count
);
}
$output
=
substr
(
$setting
,
0
,
12
);
$output
.=
$this
->
encode64
(
$hash
,
16
);
return
$output
;
}
protected
function
gensalt_extended
(
$input
)
{
$count_log2
=
min
(
$this
->
iteration_count_log2
+
8
,
24
);
// This should be odd to not reveal weak DES keys, and the
// maximum valid value is (2**24 - 1) which is odd anyway.
$count
=
(
1
<<
$count_log2
)
-
1
;
$output
=
'_'
;
$output
.=
$this
->
itoa64
[
$count
&
0x3f
];
$output
.=
$this
->
itoa64
[(
$count
>>
6
)
&
0x3f
];
$output
.=
$this
->
itoa64
[(
$count
>>
12
)
&
0x3f
];
$output
.=
$this
->
itoa64
[(
$count
>>
18
)
&
0x3f
];
$output
.=
$this
->
encode64
(
$input
,
3
);
return
$output
;
}
protected
function
gensalt_blowfish
(
$input
)
{
// This one needs to use a different order of characters and a
// different encoding scheme from the one in encode64() above.
// We care because the last character in our encoded string will
// only represent 2 bits. While two known implementations of
// bcrypt will happily accept and correct a salt string which
// has the 4 unused bits set to non-zero, we do not want to take
// chances and we also do not want to waste an additional byte
// of entropy.
$itoa64
=
'./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
;
$output
=
'$2a$'
;
$output
.=
chr
(
ord
(
'0'
)
+
$this
->
iteration_count_log2
/
10
);
$output
.=
chr
(
ord
(
'0'
)
+
$this
->
iteration_count_log2
%
10
);
$output
.=
'$'
;
$i
=
0
;
do
{
$c1
=
ord
(
$input
[
$i
++
]);
$output
.=
$itoa64
[
$c1
>>
2
];
$c1
=
(
$c1
&
0x03
)
<<
4
;
if
(
$i
>=
16
)
{
$output
.=
$itoa64
[
$c1
];
break
;
}
$c2
=
ord
(
$input
[
$i
++
]);
$c1
|=
$c2
>>
4
;
$output
.=
$itoa64
[
$c1
];
$c1
=
(
$c2
&
0x0f
)
<<
2
;
$c2
=
ord
(
$input
[
$i
++
]);
$c1
|=
$c2
>>
6
;
$output
.=
$itoa64
[
$c1
];
$output
.=
$itoa64
[
$c2
&
0x3f
];
}
while
(
1
);
return
$output
;
}
public
function
hash
(
$password
)
{
$random
=
''
;
if
(
CRYPT_BLOWFISH
==
1
&&
!
$this
->
portable_hashes
)
{
$random
=
$this
->
get_random_bytes
(
16
);
$hash
=
crypt
(
$password
,
$this
->
gensalt_blowfish
(
$random
));
if
(
strlen
(
$hash
)
==
60
)
return
$hash
;
}
if
(
CRYPT_EXT_DES
==
1
&&
!
$this
->
portable_hashes
)
{
if
(
strlen
(
$random
)
<
3
)
$random
=
$this
->
get_random_bytes
(
3
);
$hash
=
crypt
(
$password
,
$this
->
gensalt_extended
(
$random
));
if
(
strlen
(
$hash
)
==
20
)
return
$hash
;
}
if
(
strlen
(
$random
)
<
6
)
$random
=
$this
->
get_random_bytes
(
6
);
$hash
=
$this
->
crypt_private
(
$password
,
$this
->
gensalt_private
(
$random
));
if
(
strlen
(
$hash
)
==
34
)
return
$hash
;
// Returning '*' on error is safe here, but would _not_ be safe
// in a crypt(3)-like function used _both_ for generating new
// hashes and for validating passwords against existing hashes.
return
'*'
;
}
public
function
check
(
$password
,
$stored_hash
)
{
$hash
=
$this
->
crypt_private
(
$password
,
$stored_hash
);
if
(
$hash
[
0
]
==
'*'
)
$hash
=
crypt
(
$password
,
$stored_hash
);
return
$hash
==
$stored_hash
;
}
}
?>
laravel/security/hashing/engine.php
deleted
100644 → 0
View file @
92ecae3d
<?php
namespace
Laravel\Security\Hashing
;
interface
Engine
{
/**
* Perform a one-way hash on a string.
*
* @param string $value
* @return string
*/
public
function
hash
(
$value
);
/**
* Determine if an unhashed value matches a given hash.
*
* @param string $value
* @param string $hash
* @return bool
*/
public
function
check
(
$value
,
$hash
);
}
\ No newline at end of file
laravel/str.php
View file @
bcb6f189
...
...
@@ -18,7 +18,12 @@ class Str {
*/
public
static
function
lower
(
$value
)
{
return
(
fe
(
'mb_strtolower'
))
?
mb_strtolower
(
$value
,
Config
::
get
(
'application.encoding'
))
:
strtolower
(
$value
);
if
(
function_exists
(
'mb_strtolower'
))
{
return
mb_strtolower
(
$value
,
Config
::
get
(
'application.encoding'
));
}
return
strtolower
(
$value
);
}
/**
...
...
@@ -37,7 +42,12 @@ class Str {
*/
public
static
function
upper
(
$value
)
{
return
(
fe
(
'mb_strtoupper'
))
?
mb_strtoupper
(
$value
,
Config
::
get
(
'application.encoding'
))
:
strtoupper
(
$value
);
if
(
function_exists
(
'mb_strtoupper'
))
{
return
mb_strtoupper
(
$value
,
Config
::
get
(
'application.encoding'
));
}
return
strtoupper
(
$value
);
}
/**
...
...
@@ -56,7 +66,12 @@ class Str {
*/
public
static
function
title
(
$value
)
{
return
(
fe
(
'mb_convert_case'
))
?
mb_convert_case
(
$value
,
MB_CASE_TITLE
,
Config
::
get
(
'application.encoding'
))
:
ucwords
(
strtolower
(
$value
));
if
(
function_exists
(
'mb_convert_case'
))
{
return
mb_convert_case
(
$value
,
MB_CASE_TITLE
,
Config
::
get
(
'application.encoding'
));
}
return
ucwords
(
strtolower
(
$value
));
}
/**
...
...
@@ -75,7 +90,12 @@ class Str {
*/
public
static
function
length
(
$value
)
{
return
(
fe
(
'mb_strlen'
))
?
mb_strlen
(
$value
,
Config
::
get
(
'application.encoding'
))
:
strlen
(
$value
);
if
(
function_exists
(
'mb_strlen'
))
{
return
mb_strlen
(
$value
,
Config
::
get
(
'application.encoding'
));
}
return
strlen
(
$value
);
}
/**
...
...
@@ -91,7 +111,9 @@ class Str {
*/
public
static
function
ascii
(
$value
)
{
$value
=
preg_replace
(
array_keys
(
$foreign
=
Config
::
get
(
'ascii'
)),
array_values
(
$foreign
),
$value
);
$foreign
=
Config
::
get
(
'ascii'
);
$value
=
preg_replace
(
array_keys
(
$foreign
),
array_values
(
$foreign
),
$value
);
return
preg_replace
(
'/[^\x09\x0A\x0D\x20-\x7E]/'
,
''
,
$value
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment