Nasıl güvenle benim kullanıcıların şifrelerini saklayabilirsiniz?

5 Cevap php

Daha ne kadar güvenli bu düz daha MD5? Ben sadece şifre güvenliği içine bakarak başladım. Ben PHP oldukça yeni.

$salt = 'csdnfgksdgojnmfnb';

$password = md5($salt.$_POST['password']);
$result = mysql_query("SELECT id FROM users
                       WHERE username = '".mysql_real_escape_string($_POST['username'])."'
                       AND password = '$password'");

if (mysql_num_rows($result) < 1) {
    /* Access denied */
    echo "The username or password you entered is incorrect.";
} 
else {
    $_SESSION['id'] = mysql_result($result, 0, 'id');
    #header("Location: ./");
    echo "Hello $_SESSION[id]!";
}

5 Cevap

Şifrenizi depolama düzeni güvenli almak için en kolay yolu, using a standard library gereğidir.

Güvenlik çok daha karmaşık olma eğilimindedir ve standart bir kütüphane kullanarak daha fazla görünmeyen vidası kadar en programcılar tek başına mücadele edemeyeceğiniz olanakları ile hemen hemen her zaman en kolay ve en güvenli (yoksa sadece) seçenek olduğu için.

The standard library:
Take a look at: Portable PHP password hashing framework: phpass and make sure you use the CRYPT_BLOWFISH algorithm if at all possible.

phpass (v0.2) kullanarak kod örneği:

require('PasswordHash.php');

$pwdHasher = new PasswordHash(8, FALSE);

// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );

// $hash would be the $hashed stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

PHPass bazıları oldukça iyi bilinen projelerinde uygulamaya konmuştur:

  • phpBB3
  • WordPress 2.5 + hem de bbPress
  • Drupal 7 sürümü, (modül Drupal 5 ve 6 için kullanılabilir)
  • others

Iyi bir şey detayları hakkında endişelenmenize gerek yok, bu detayları deneyimi olan kişiler tarafından programlanan ve internet üzerinde pek çok millet tarafından gözden geçirilmiştir olduğunu.

Şifre saklama planları hakkında daha fazla bilgi için, okumak Jeff `s blog post: You're Probably Storing Passwords Incorrectly

Eğer 'I'll do it myself, thank you' yaklaşım için gitmek eğer yaparsanız yapın, do not use MD5 veya SHA1 artık . They are nice hashing algorithm, but considered broken for security purposes.

Currently, using crypt, with CRYPT_BLOWFISH is the best practice.
CRYPT_BLOWFISH in PHP is an implementation of the Bcrypt hash. Bcrypt is based on the Blowfish block cipher, making use of it's expensive key setup to slow the algorithm down.

Kullanıcıların bunun yerine SQL ifadeleri bitiştirilmesinin parametreli sorgular kullanılırsa çok daha güvenli olacaktır. Ve the salt her kullanıcı için benzersiz olmalı ve parola karma ile birlikte saklanmalıdır.

Her kullanıcı benzersiz bir tuz olması için daha iyi bir yolu olacaktır.

Bir tuz olmasının yararı zor bir saldırganın her sözlük kelimenin MD5 imza ön oluşturmak için yapar olmasıdır. Bir saldırganın sabit bir tuz olduğunu öğrenir Ama eğer, o zaman sabit tuz ile başlayan her kelimenin sözlük MD5 imza önceden yaratacaktır.

Daha iyi bir yol sistem kullanıcı kaydı ile birlikte tuz rastgele bir tuz ve mağaza oluşturmak, bir kullanıcı parolasını değiştirir her zaman. Bu şifreyi kontrol etmek biraz daha pahalı yapar (sen MD5 imza üretebilir önce tuz bakmak gerekiyor çünkü) ama o çok daha zor bir saldırgan MD5 en ön oluşturmak için yapar.

PHP 5.5 ile ben yeni, yerleşik bir çözüm kullanmak önermek istiyorum köşeyi (ne tarif, aşağıya bakın hatta önceki sürümleri için kullanılabilir): password_hash() and password_verify() . It provides several options in order to achieve the level of password security you need (for example by specifying a "cost" parameter through the $options dizisi)

<?php
var_dump(password_hash("my-secret-password", PASSWORD_DEFAULT));

$options = array(
    'cost' => 7, // this is the number of rounds for bcrypt
    // 'salt' => 'TphfsM82o1uEKlfP9vf1f', // you could specify a salt but it is not recommended
);
var_dump(password_hash("my-secret-password", PASSWORD_BCRYPT, $options));
?>

döndürür

string(60) "$2y$10$w2LxXdIcqJpD6idFTNn.eeZbKesdu5y41ksL22iI8C4/6EweI7OK."
string(60) "$2y$07$TphfsM82o1uEKlfP9vf1fOKohBqGVXOJEmnUtQu7Y1UMft1R4D3d."

Gördüğünüz edebileceğiniz gibi, dize seçeneklerinde belirtilen yanı sıra maliyet tuz içerir. Ayrıca, kullanılan algoritma içerir.

Şifreyi kontrol ederken ücretsiz password_verify() işlevini kullanırken Bu nedenle, (örneğin, kullanıcı günlükleri ne zaman), bu parola karma kendisinden gerekli kripto parametreleri çıkartacaktır.

Bir tuz belirterek değilken tuz rasgele oluşturulur, çünkü oluşturulan parola hash password_hash() her çağrısı üzerine farklı olacaktır. Bu nedenle yeni oluşturulan biriyle bir önceki karma karşılaştıran bile doğru şifre için, başarısız olur.

Bu gibi çalışır doğrulanıyor:

var_dump(password_verify("my-secret-password", '$2y$10$BjHJbMCNWIJq7xiAeyFaHOGaO0jjNoE11e0YAer6Zu01OZHN/gk6K'));
var_dump(password_verify("wrong-password", '$2y$10$BjHJbMCNWIJq7xiAeyFaHOGaO0jjNoE11e0YAer6Zu01OZHN/gk6K'));

var_dump(password_verify("my-secret-password", '$2y$07$TphfsM82o1uEKlfP9vf1fOKohBqGVXOJEmnUtQu7Y1UMft1R4D3d.'));
var_dump(password_verify("wrong-password", '$2y$07$TphfsM82o1uEKlfP9vf1fOKohBqGVXOJEmnUtQu7Y1UMft1R4D3d.'));

Ben programcı uygun bir uygulamaya koymak zorundadır düşünce miktarını azaltır gibi bu yerleşik işlevleri sağlayan yakında veri hırsızlığı durumunda daha iyi şifre güvenliğini sağlayacağını umuyoruz.

5.5 's PHP verecek küçük bir kütüphane (bir PHP dosyası) var password_hash PHP 5.3.7 +: https://github.com/ircmaxell/password_compat

Bu bana iyi. Bay Atwood (bazı rasgele noktalama / sayılar olsa, onu artırabilir) oldukça oturuyorsun o the strength of MD5 against rainbow tables hakkında, ve temelde gibi uzun bir tuz ile yazdı.

Ayrıca bu gün daha popüler almak gibi görünüyor, SHA-1 bakmak olabilir.