Skip to content
Permalink
Browse files

Passwords

  • Loading branch information...
dg committed Feb 20, 2019
1 parent 8d0709e commit d738070267e26b0e871045916aedfe935f092cea
Showing with 46 additions and 22 deletions.
  1. +7 −3 cs/access-control.texy
  2. +16 −8 cs/passwords.texy
  3. +7 −3 en/access-control.texy
  4. +16 −8 en/passwords.texy
@@ -106,22 +106,26 @@ class MyAuthenticator implements NS\IAuthenticator
{
private $database;

public function __construct(Nette\Database\Context $database)
private $passwords;

public function __construct(Nette\Database\Context $database, Nette\Security\Passwords $passwords)
{
$this->database = $database;
$this->passwords = $passwords;
}

public function authenticate(array $credentials): Nette\Security\Identity
{
list($username, $password) = $credentials;
[$username, $password] = $credentials;

$row = $this->database->table('users')
->where('username', $username)->fetch();

if (!$row) {
throw new Nette\Security\AuthenticationException('User not found.');
}

if (!Nette\Security\Passwords::verify($password, $row->password)) {
if (!$this->passwords->verify($password, $row->password)) {
throw new Nette\Security\AuthenticationException('Invalid password.');
}

@@ -2,7 +2,7 @@ Hashování hesel
***************

.[perex]
Abychom zajistili bezpečnost našich uživatelů, neukládáme jejich hesla v čitelné podobě, ale uložíme si pouze otisk (tzv. hash). Z otisku nelze zpětně zrekonstruovat původní podobu hesla. Je důležité použít bezpečný algoritmus, kterým otisk vytvoříme. S tím nám pomůže statická třída [Nette\Security\Passwords |api:].
Abychom zajistili bezpečnost našich uživatelů, neukládáme jejich hesla v čitelné podobě, ale uložíme si pouze otisk (tzv. hash). Z otisku nelze zpětně zrekonstruovat původní podobu hesla. Je důležité použít bezpečný algoritmus, kterým otisk vytvoříme. S tím nám pomůže třída [Nette\Security\Passwords |api:].

Všechny příklady předpokládají vytvořený alias:

@@ -11,16 +11,24 @@ use Nette\Security\Passwords;
\--


hash(string $passwords, array $options=null): string .[method]
==============================================================
__construct(int $algo = PASSWORD_DEFAULT, array $options=null): string .[method]
================================================================================

Vygeneruje hash hesla pomocí moderního algoritmu bcrypt. Můžeme určit parametr `cost` z rozsahu 4-31, který udává kolik iterací algoritmu má proběhnout. Pokud parametr neurčíme, bude použita výchozí hodnota `10`.
Bude generovat hash hesla pomocí moderního algoritmu. Můžeme určit parametr `cost` z rozsahu 4-31, který udává kolik iterací algoritmu má proběhnout. Pokud parametr neurčíme, bude použita výchozí hodnota `10`.

Parametr `cost` je exponent funkce 2^n. Pokud zvolíme hodnotu příliš vysokou, bude výpočet trvat velmi dlouho. Při nejvyšší hodnotě 31 trvá výpočet hesla cca 64 hodin.

/--php
$hash = Passwords::hash($password); // Zahashuje heslo
$hash = Passwords::hash($password, ['cost' => 12]); // Zahashuje heslo 12 iteracemi algoritmu bcrypt
$passwords = new Passwords(PASSWORD_BCRYPT, ['cost' => 12]); // Zahashuje heslo 12 iteracemi algoritmu bcrypt
\--

hash(string $passwords, array $options=null): string .[method]
==============================================================

Vygeneruje hash hesla pomocí moderního algoritmu.

/--php
$hash = $passwords->hash($password); // Zahashuje heslo
\--

verify(string $password, string $hash): bool .[method]
@@ -29,7 +37,7 @@ verify(string $password, string $hash): bool .[method]
Zjistí, zda dané heslo odpovídá danému otisku.

/--php
if (Passwords::verify($password, $hash)) {
if ($passwords->verify($password, $hash)) {
// Provede se, pokud heslo odpovídá otisku
} else {
// Provede se, pokud heslo neodpovídá otisku
@@ -42,7 +50,7 @@ needsRehash(string $password, array $options=null): bool .[method]
Zjistí, zda hash odpovídá zadaným volbám. Můžeme nastavit `cost` z rozsahu 4-31, který udává kolik iterací algoritmu má proběhnout. Pokud parametr neurčíme, bude použita výchozí hodnota `10`.

/--php
if (Passwords::needsRehash($hash)) {
if ($passwords->needsRehash($hash)) {
// Provede se, pokud je potřeba heslo přehashovat
}
\--
@@ -107,22 +107,26 @@ class MyAuthenticator implements NS\IAuthenticator
{
private $database;

public function __construct(Nette\Database\Connection $database)
private $passwords;

public function __construct(Nette\Database\Context $database, Nette\Security\Passwords $passwords)
{
$this->database = $database;
$this->passwords = $passwords;
}

public function authenticate(array $credentials): Nette\Security\Identity
{
list($username, $password) = $credentials;
[$username, $password] = $credentials;

$row = $this->database->table('users')
->where('username', $username)->fetch();

if (!$row) {
throw new Nette\Security\AuthenticationException('User not found.');
}

if (!Nette\Security\Passwords::verify($password, $row->password)) {
if (!$this->passwords->verify($password, $row->password)) {
throw new Nette\Security\AuthenticationException('Invalid password.');
}

@@ -2,7 +2,7 @@ Password Hashing
****************

.[perex]
To manage security of our users, we never save their passwords in plaintext format, but we rather save the password´s fingerprint (eg. hash). There is no way to find out the real password from the password´s fingerprint. To create the fingerprint we have to use a save algorithm. Static class [Nette\Security\Passwords |api:] will help us with this.
To manage security of our users, we never save their passwords in plaintext format, but we rather save the password´s fingerprint (eg. hash). There is no way to find out the real password from the password´s fingerprint. To create the fingerprint we have to use a save algorithm. Class [Nette\Security\Passwords |api:] will help us with this.

Following examples expect this alias:

@@ -11,16 +11,24 @@ use Nette\Security\Passwords;
\--


hash(string $passwords, array $options=null): string .[method]
==============================================================
__construct(int $algo = PASSWORD_DEFAULT, array $options=null): string .[method]
================================================================================

This method generates password´s hash using a modern bcrypt algorithm. We can set the `cost` parameter of range 4-31, which sets the number of iterations the algorithm takes to run. If we omit this parameter, a default value of `10` will be used.
Will generate password´s hash using a modern algorithm. We can set the `cost` parameter of range 4-31, which sets the number of iterations the algorithm takes to run. If we omit this parameter, a default value of `10` will be used.

The `cost` parameter is an exponent of function 2^n. If we set its value too high, the hash computation will take too long. By using the highest value of 31 the computation takes approximately 64 hours.

/--php
$hash = Passwords::hash($password); // Hashes the password
$hash = Passwords::hash($password, ['cost' => 12]); // Hashes the password using 12 iterations of bcrypt algorithm
$passwords = new Passwords(PASSWORD_BCRYPT, ['cost' => 12]); // Hashes the password using 12 iterations of bcrypt algorithm
\--

hash(string $passwords, array $options=null): string .[method]
==============================================================

This method generates password´s hash using a modern algorithm.

/--php
$hash = $passwords->hash($password); // Hashes the password
\--

verify(string $password, string $hash): bool .[method]
@@ -29,7 +37,7 @@ verify(string $password, string $hash): bool .[method]
This method finds out, if given password matches given fingerprint (hash).

/--php
if (Passwords::verify($password, $hash)) {
if ($passwords->verify($password, $hash)) {
// This will run, if password matches the fingerprint (hash)
} else {
// This will run, if password does not match the fingerprint (hash)
@@ -42,7 +50,7 @@ needsRehash(string $password, array $options=null): bool .[method]
This method finds out, if the hash matches given options. We can set the `cost` parameter of range 4-31, which sets the number of iterations the algorithm takes to run. If we omit this parameter, a default value of `10` will be used.

/--php
if (Passwords::needsRehash($hash)) {
if ($passwords->needsRehash($hash)) {
// This will run, if the password needs to be rehashed
}
\--

0 comments on commit d738070

Please sign in to comment.
You can’t perform that action at this time.