Kohana: Anlama ve Salt & üreyen

2 Cevap php

Ben Kohana v 2.3.4 Auth modülü kullanıyorum.

Kullanıcıların kimlik doğrulaması açısından, iki aşamalı bir süreç var. Giriş noktası işlevini giriş olduğunu. Bu ilk görev veritabanında saklanan şifre almak ve şifreyi almak ve tuz değerini belirlemektir bulunuyor. Tuz sözde her bir tuzun daha başka bir kısmı duhul $ tuz içinde bir noktaya. $ Şifre karma değerine karşılık gelen değerler dizisi ile belirlenir. Benim durumumda, ben md5 kullanıyorum.

Sorunlar:

  1. Ben bu SALT değeri için yapılveırma bulamıyorum. Bu veritabanında saklanan parola içinde zaten mevcut bir güvenerek gibi görünüyor. Bir veya bu giriş taşınabilir ve tekrarlanabilir olması gerekir çünkü ben bunu AUTH'u yapılveırmanız gerekiyor var mı? Bu hash_password rutin, tuz bulamıyorsa, ben inanmıyorum uniqid kullanarak varsayılan (), tüm taşınabilir.

  2. Kullanıcı ekleme açısından, bu özelliği eklemek için Auth kütüphane değiştirmek için mantıklı mı? yani, o bir MD5 hash yapmak ve sonra md5sum belirli noktalarda yer alan şifreyi tohum tuz tarafından oluşturulan bu md5 kullanmak, diyebilirim benim kendi özelleştirilmiş SALT tanıtmak?

  3. Ben hiçbir güvenlik uzmanı değilim, ama bu overkill? Verilen, önceden belirlenmiş sağlamalarının bir md5 arama kullanarak md5 şifre listesinden erişmek vardı birisi engeller.

  4. Eğer Kohana PHP çerçeve kullanılan varsa, bu sorun için doğru yaklaşım fikir verebilir ki bunu kullveıktan sonra herhangi öğrenilen dersleri veya deneyimleri varsa, bana bildirin. Ben bu konuda çok sayıda forum ve wiki bulunuyor okuyorum, ve gerçek somut bir fikir gördüm ki henüz yoktur. Ben bir iPhone gibi, aslında bu sitede birisi kimlik doğrulaması için bir tekrarlanabilir bir yaklaşım almaya çalışırken, hem PHP kullanarak ve sonunda bir mobil cihazdan ediyorum. Ben de OpenID desteği ve entegrasyonu için bağlanmak sonunda google arkadaşı için destek ekleyerek düşünüyorum.

Aşağıda ilgi fonksiyonlarını ilişkin Kohana yılında Auth modülü gelen parçacıkları vardır. Ben daha iyi oluyor anlamaya çalışıyorum gibi onlar bazı hata ayıklama var.


public function login($username, $password, $remember = FALSE)
{
	if (empty($password))
		return FALSE;

	if (is_string($password))
	{
		// Get the salt from the stored password
		$salt = $this->find_salt($this->driver->password($username));
		Kohana::log('debug', "--- Auth_Core login salt = $salt ");
		Kohana::log('debug', "--- Auth_Core login pass = $password ");

		// Create a hashed password using the salt from the stored password
		$password = $this->hash_password($password, $salt);
	}
	Kohana::log('debug', "--- Auth_Core login pass_hash = $password ");
	return $this->driver->login($username, $password, $remember);
}
public function find_salt($password)
{
	$salt = '';

	foreach ($this->config['salt_pattern'] as $i => $offset)
	{
		// Find salt characters, take a good long look...
		//$salt .= $password[$offset + $i];
		$salt .= substr($password, $offset + $i, 0);
	}

	return $salt;
}
public function hash_password($password, $salt = FALSE)
{
	Kohana::log('debug', "--- Auth_Core Original Pass = $password ");
	if ($salt === FALSE)
	{
		// Create a salt seed, same length as the number of offsets in the pattern
		$salt = substr($this->hash(uniqid(NULL, TRUE)), 0, count($this->config['salt_pattern']));
		Kohana::log('debug', "--- Auth_Core salt created = $salt ");
	}

	// Password hash that the salt will be inserted into
	$hash = $this->hash($salt.$password);

	// Change salt to an array
	$salt = str_split($salt, 1);

	// Returned password
	$password = '';

	// Used to calculate the length of splits
	$last_offset = 0;

	foreach ($this->config['salt_pattern'] as $offset)
	{
		// Split a new part of the hash off
		$part = substr($hash, 0, $offset - $last_offset);

		// Cut the current part out of the hash
		$hash = substr($hash, $offset - $last_offset);

		// Add the part to the password, appending the salt character
		$password .= $part.array_shift($salt);

		// Set the last offset to the current offset
		$last_offset = $offset;
	}

	Kohana::log('debug', "--- Auth_Core hashpw = $password + $hash ");

	// Return the password, with the remaining hash appended
	return $password.$hash;
}

2 Cevap

Problem 1. tuzu konfigürasyonu config/auth.php depolanır. modules/auth/config bu dosyayı bulun, sonra da app/config klasörüne (zaten bilinen olabilir gibi, Kohana dosya sistemi mekanizması basamaklı kullanır). Eğer app/config/ klasöre özelleştirmek için teşvik edilir varsayılan dosya, aşağıdaki gibi görünüyor:

<?php defined('SYSPATH') OR die('No direct access allowed.');

return array
(
  'driver' => 'ORM',
  'hash_method' => 'sha1',
  'salt_pattern' => '1, 3, 5, 9, 14, 15, 20, 21, 28, 30',
  'lifetime' => 1209600,
  'session_key' => 'auth_user',
  'users' => array
  (
  	// 'admin' => 'b3154acf3a344170077d11bdb5fff31532f679a1919e716a02',
  ),
);

Problem 2. Bence, tuz ekleme ile SHA1 Auth tarafından kullanılan parola bozma mekanizması, oldukça güvenli, sizin auth.php dosyası yani, sizin tuzlarını tutmak sağlanan güvenli olduğunu.

Problem 3. Auth yerleşik bir mekanizma karma görece daha çatlamaya karşı MD5 daha SHA1, kullanır, bu yüzden ne olursa olsun düzeni görünebilir ne kadar karmaşık, MD5 yol yapmıyoruz söyleyebilirim. Bir güvenlik uzmanı Thomas Ptacek his blog yazdı:

No, really. Use someone else’s password system. Don’t build your own.

Most of the industry’s worst security problems (like the famously bad LANMAN hash) happened because smart developers approached security code the same way they did the rest of their code.

Problem 4. Evet ben küçük bir şirket web sitesi ve müşterilerimizin web sitesinin bazı oluşturmak için Kohana kullanıyorum ve çok diyemeyiz, ancak şimdiye kadar ben, Auth modülü ile herhangi bir sorun bulmuyorum çünkü ben Gerçekten gerçek güvenlik-ilgili web sitesi için kullanmış değil. Ama genel olarak, ben Kohana özellikle basamaklı dosya sistemi mekanizması ile mükemmel bir çerçeve olduğunu söyleyebilirim.

Regarding point 1, hash_password() function (örn. kayıt zamanında) veritabanında saklanır yanı olduğu (tuzu ve tuz dahil) karşı parola karma oluşturmak için hem de kullanılan şifreniz doğrulanamadı gerektiğinde bu karma yeniden olarak (örn. giriş-zaman). hash_password() function (none verilirse veya uniqid()) şifre karma kendisi verilen herhangi bir tuz kodlar; o salt_pattern anahtar şifreleme bir formudur; salt_pattern gizli tutulması eğer bir düşman yapmak mümkün olmayacaktır çünkü, ardından [) (6] {(çevrimdışı brute-zorla sağlama yöntemi beri karma tekrarlanabilir değildir ek güvenlik sağlar } salt_pattern sır olarak saklanabiliyor):

// Signup time; forget about uniqid(); you can use any salt that
// you please; once the password hash is stored in the database there
// is no need to know where your salt came from since it will be
// included in the password hash.
$password_hash = hash_password($password, FALSE);

// Login time; note that the salt is taken from the password hash itself.
$reproduced = hash_password($password, find_salt($password_hash));
$verifies   = $password_hash == $reproduced;

hash_password() function ilk tuzun karşı parola karma, ve sonra gelen salt_pattern ofset parola karma içine tuz her karakter eklemek olacaktır. Karma çoğaltılabilir böylece find_salt() bu tuz karekter çıkartacaktır. Sen hash_password() tuz şifreleyerek ve find_salt() şifresini olarak görebilirsiniz. De o hash_password() tuz gizleme ve find_salt() bunu bulmakta gelmiştir görebilirsiniz rağmen, bu şifreleme yöntemi, steganography, sanırım denilen olamaz o çünkü parola karma (tuz varlığı sır değil) ile saklanan bir tuz olduğunu kodundan açıktır.

Regarding point 2, kendi tuz kullanarak basit ve Auth modülü ve zaten varolan bir veritabanı ile tam uyumludur.

Regarding point 3, bir kullanıcı başına tuz kullanılarak (uniqid() Varsayılan) not overkill. Özellikle güvenlik amaçlı kırık ve çarpışmalar bulma bugünün teknolojisi ile zaten pratik olduğu bir MD5 ile. Hatta daha kaba-zorlama girişimleri önlemek için kasıtlı yavaş karma algoritması kullanır bcrypt() hangi kullanmak olacaktır.

Regarding point 4, ben önce Kohana çerçeve kullanılan, ancak çoğaltılmasını ya Auth modülü taşıma basittir değil. Bakımı salt_pattern unutulmuş ya da karma algoritması önemli bir parçası olduğu için kayıp değil dikkat edilmelidir. Brute-zorla şifre sağlamalarının bir determined düşman tutan tek şey bu yana salt_pattern de gizli tutulmalıdır. uniqid() sadece makul varsayılan ve istediğiniz ile değiştirilebilir (sürece olduğu gibi kullanıcı-başına değil, sabit bir site çapında değer.)


Ayrıca, orada portable bcrypt() ve PHP . Naturally that will not Auth modülü ile uyumlu olması konusunda burada stackoverflow üzerinde çok iyi bir cevap olduğunu, ama ben sadece en iyi uygulama için olduğundan yine de bahsetmek istiyorum yavaş karma kullanın ve salt_patten gibi tutmak zor olan sırları, güvenmek değil.