php şifreleme sql

3 Cevap php

Ben kullanıcı parolasını değiştirebilir bir form istiyorum. Ben onu tanımıyor (orijinal şifre 'test' demek) veritabanından seçildiğinde, ancak şifre şifrelemek mümkün duyuyorum.

Şifre db şifreli edildiğinde budur. i şeklinde yazdığınız şifre db eşleşen olmadığını görmek için kontrol ediyorum:

SELECT * from table where password = md5('$typed_password')

Bu şifreli nasıl:

UPDATE table set field = md5('$typed_password' )

Nasıl benim seçin çalışma şeklinde orjinal bir kullanıcı tipleri bu recognied olduğu zaman öyle mi?

3 Cevap

öncelikle: MD5 cryptographic hash function, ille bir şifreleme yöntemidir. Bir karma tek bir yönde gerçekleşmesini üzere tasarlanmıştır ve geri alınamaz. (Bu iyi bir şeydir)

MD5 ancak kriptografik (artık güvenli kabul) kırık; Başka bir hash fonksiyonu (tercih Bcrypt-karma veya en azından SHA256) kullanmalısınız

Koduna baktığımızda, birçok şeyi yanlış görebilirsiniz:

  1. şifrenizi değil salted
  2. Gerçekten $typed_password düzgün dezenfekte veya SQL-injection için vardır umuyoruz.
  3. Aynı şifre ile tablodan tüm kullanıcıları seçmek için deneyin.

Şifreleri yapmanın en kolay (ve muhtemelen en iyi) yolu, standart bir kütüphane kullanmaktır: Portable PHP password hashing framework and make sure you use the CRYPT_BLOWFISH algoritması.

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 $hash stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

mağaza / çek / güncelleştirme sorguları kullanıcının kimliği bağlı olmalıdır:

// Insert query
$query = "INSERT INTO users VALUES({$userId}, '{$username}', '{$hash}')";

// Select query
$query = "SELECT hash FROM users WHERE userId = {$userId}";

// Update query
$query = "UPDATE users SET hash = '{$hash}' WHERE userId = {$userId}";

Ve sonra, bunun yerine doğrudan sorgu içine değişken değerleri geçen parametrised queries kullanmalısınız.

Ben bu seferde bir sürü bilgi olduğunu fark, ancak komut orada hemen hemen her programcı tarafından hackable olmak istemiyorsanız bu öğrenmek önemlidir.

Why not encrypt the password in PHP and then INSERT already encrypted one.
Same with SELECT.

Yani:

$enc_passwd = md($typed_password);
$sql = "SELECT * FROM table WHERE password = '$enc_passwd')";

UPDATE ile benzer

(Neden değil INSERT?)

A recent post on passwords I got a little off topic and covered a lot of this. A tidbit:

Eğer onlar mağaza, sonra ilk PHP ile bunu şifrelemek almış şifre ile mutlu bir kez. Aşağıdaki şifre şifreleme işlevi ya benim fikrim değil, ancak bir takım sorunlar çözer. PHP içinde şifreleyerek şifrelenmemiş parolalar kesen bir paylaşılan bir sunucuda insanları engeller. Değişmeyecek kullanıcı başına bir şey ekleme (bu benim siteler için kullanıcı adı olduğu gibi e-posta kullanmak) ve (SALT I site başına değiştirmek kısa bir sabit dize) bir karma eklemek saldırılara karşı direnci arttırır. SALT parola içinde yer almaktadır, ve şifre herhangi bir uzunlukta olabilir, çünkü bir gökkuşağı tablo ile bu saldırı neredeyse imkansız hale gelir. Alternatif aynı zamanda insanların kendi e-posta değiştiremez ve olsa herkesin şifresini geçersiz olmadan SALT değiştirmek anlamına gelir.

function password_crypt($email,$toHash) {
   $password = str_split($toHash,(strlen($toHash)/2)+1);
   return hash('sha256', $email.$password[0].SALT.$password[1]); 
}

Yani kullanıcı parolasının ilk girişi, sahte kod:

define(SALT,'blah');
$hashed_password = password_crypt($email,$password);
INSERT INTO users (email,hashed_password) VALUES ($email,$hashed_password);

Sonra sahte kodda bir sonraki giriş kontrol etmek için:

define(SALT,'blah');
$user_hashed_password = password_crypt($_POST['username'],$_POST['password']);
SELECT email FROM users WHERE email = ? AND hashed_password = $user_hashed_password LIMIT 1

Geri bir satır olsun, geçerli giriş.