calculateHash v Authenticatoru by měla používat jedinečnou sůl
- joe
- Člen | 313
Ahoj,
z jakého důvodu to tak nedělá (píšu o sandboxu, ze kterého plno lidí vychází)
Stejné hesla by měly mít v databázi uloženou jinou hash, správně by tedy mělo být:
public function calculateHash($password, $salt)
{
return sha1($password . str_repeat($salt, 10));
}
Editoval joe (12. 8. 2011 16:15)
- Filip Procházka
- Moderator | 4668
Lepší by bylo, kdyby jsi sepsal RFC a udělal ukázkovou implementaci, jak by to mohlo být v sandboxu lépe.
Na druhou stranu. Jsi si jistý, že je dobře, zatěžovat začátečníky solením?
- Mikulas Dite
- Člen | 756
Já to tak mám, ale stejně celý authenticator překopávám (jiné Orm, jiné DI, …). Pro začátečníky bylo ale Nette vždycky popostrčení k best practice, tzn. klidně tam ten salt mít může. Já jsem pro.
Co prostě takhle:
public function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = $this->users->where('username', $username)->fetch();
if (!$row) {
throw new NS\AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND);
}
if ($row->password !== $this->calculateHash($password, $row->salt)) {
throw new NS\AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
}
unset($row->password);
unser($row->salt);
return new NS\Identity($row->id, $row->role, $row->toArray());
}
/**
* Computes salted password hash.
* @param string
* @param string
* @return string
*/
public function calculateHash($password, $salt)
{
return md5($password . $salt);
}
}
- joe
- Člen | 313
Mikulas Dite – on tam ten salt je, ale je pořád stejný. A každý uživatel by měl mít jiný. A jinak osobně bych nerozlišoval existenci uživatele a chybné heslo – tím se totiž někdo může jednoduše dozvědět, jestli na těch stránkách je někdo registrovaný nebo ne. Proto upřednostňuju hlášku „Neexistující uživatel nebo chybné heslo“ (jako má například Seznam – také Vám neřekne, že jen heslo je špatné), ze které se nic nedozví.
HosipLan
Lepší by bylo, kdyby jsi sepsal RFC a udělal ukázkovou implementaci, jak by to mohlo být v sandboxu lépe.
Asi budu za … ale nevím co přesně je RFC a co všechno se pod tím skrývá, nemám teď zase tolik času, abych se mohl věnovat programování i mimo mé projekty a vytvářet nějaké ukázkové implementace. Jen během tvorby občas narazím na nějakou drobnost, co mi nějak nejde do hlavy a proto ji sem třeba napíšu. Kdybych měl čas (volný čas bych raději trávil mimo PC, mám toho nějak dost), tak se do toho klidně pustím.
- Mikulas Dite
- Člen | 756
@Joe je mi to úplně jasné, proto tam posílám ten salt dynamicky z $row dat konkrétního uživatele.
RFC je blbost :) na takhle malou změnu, prostě pošli pull na repo.
- Filip Procházka
- Moderator | 4668
V RFC popisuješ co je podle tebe špatně a jak jinak bys to řešil a ani to nemusí být dlouhý popis.
Ale tady by to bylo asi zbytečné. Každopádně, pull můžeš poslat vždycky :)