calculateHash v Authenticatoru by měla používat jedinečnou sůl

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
joe
Člen | 313
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

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 :)