Bir veritabanı olmadan kullanıcı adı ve şifre depolamak için en iyi yolu

8 Cevap php

PHP basit bir tek kullanıcı giriş "kütüphane" kurmak istiyorum, ama ben şu ikilemle karşı karşıya ediyorum: Ben bir veritabanı kullanarak değilim, nasıl ben kullanıcı adı ve parola depolamak gerekir?

Böylece bir seçenek değil basit bir düz metin dosyası kolayca okunabilir ve sonra şifre kolayca decripted olabilir.

Ben sadece bir php dosyası oluşturursanız

<?php
    $Username= "username";
    $Password= "password";
?>

sonra kimse onu okumak ve ben sadece bunu gerek bu dosyayı içerebilir gerekir, ama bunu yapmak için daha iyi bir yol bulamıyorum gerçekten emin değilim!

Peki, sizce, bu soruna en iyi çözüm (ve neden?)

Teşekkürler

8 Cevap

Bir düz metin dosyası is bir seçenek, ve burada basit bir çözümdür. Basitçe Parola karma ile (salt). Bu, güvenilir bir şekilde şifresi çözülebilen değildir.

Bunun için PHP'nin md5 or sha1 karma işlevlerini kullanabilirsiniz.

Bir dosya depolamak ve bir SHA1/SHA2 karma deşifre edilemez şekilde kullanabilirsiniz.

user:<sha1hash>
user:<sha1hash>
...

Eğer birden çok hesabı gerekiyorsa, bir düz metin dosyası PHP kaynak dosyasını kullanarak daha kolay olacaktır. Ben insanlar olsa kendi tarayıcısı üzerinden dosya talep konusunda endişeli olduğunu mu sanıyorsun?

Web barındırma, örneğin, gerçek bir web içerik olduğu bir üst dizini kamuya erişilebilir değil dizinde bir tür olup olmadığını kontrol edin. PHP genellikle okuma ve orada yazmak mümkün olacak, ancak web üzerinden erişilebilir olmayacaktır.

Eğer erişimi olan böyle bir dizin yoksa dosya izinleri ve / veya .htaccess files (Apache) size yardımcı olabilir.

Seni çok düz şifreleri depolamak yerine, parola (hash) depolamak için crypt fonksiyonunu kullanmanızı öneririz. Bu onlara rağmen saklamak yerden ayrı bir konudur :)

Bir kullanıcı sadece hiç varsa bir adı olan amacı nedir?

De sadece. Htaccess kullanarak izinleri yönetmek olabilir ...

(Bu Mokuchan cevaben, Daniel Dipaolo bir açıklama olarak başladı.)

Bir parola (olursa olsun konumu) saklamak istiyorsanız, aşağıdaki şemayı kullanın:

$ HashedPassword = $ tuz. hash (. $ tuz $ password);

Karma şifre saklama yeri güvenli olmalıdır. Bir veritabanında veya uygun izinleri seti ile bir dosyada.

Bir dosya varsa, bob şifre ile kullanıcı için 'rekor' secret (BCrypt Hash kullanarak) bu gibi bir şey olacaktır:

bob:$2a$05$tlk4M8WSpVkO7ER6QGxcwuY91MrBCQn.TCDZ5eOM1iz2sCChtR62K

Herkes şifre 'şifresini' için hiçbir yolu yoktur. Yani bir Özetleme algoritması kullanarak bütün mesele şu: bu non-geri dönüşümlüdür.

Bunu devlet:

Orada MD5 ve SHA1 şifresini deneyin bazı araçlar vardır, ve en azından bazı durumlarda işe gibi görünüyor

Karma algoritmalar olmayan geri dönüşümlü olarak, bu mümkün değildir. (Hayır 'şifresini' seçenek var)

My best guess is that you are referring to a tool that looked up a hash from a precomputed table and it returned a valid input string, likely to be your password.
These tables are called rainbow tables. They can be defeated by A) using a random salt and B) using a strong hashing algorithm (BCrypt hash or SHA2-family hash for example)

Ilgili yanlış karma algoritmalar: MD5 ve SHA1 kriptoğrafik kırık kabul edilir. Başka bir deyişle: Eğer bir daha bunları kullanarak olmamalıdır.

Bu konuda bir tartışma için, bkz: http://stackoverflow.com/questions/2768248/is-md5-really-that-bad

Ditto şifresini şifrelemek söyleyerek tüm bu.

Ayrıca, belge ağacındaki dosyayı koymayın. Başka bir yere dosya koymak. Sizin PHP program hala ".." ancak birçok düzeyleri dosyanın nerede olduğunu sonra hiyerarşi ve yukarı çalışmaya gider mutlak bir yol veya göreceli yolu belirterek okumak gerekir. Ben herhangi PHPing yaptık çünkü bir süre oldu - -. (Java apps, orada bu tür şeyler saklamak için uygun bir WEB-INF dizini PHP böyle bir şey olduğunu sanmıyorum ama yapabilirsiniz her zaman sadece uygulamanın dizin hiyerarşisi dışında tamamen dosya koymak.)

Bu birini kullanın, tekerleği yeniden icat etmeyin http://pear.php.net/manual/en/package.fileformats.file-passwd.file-passwd-unix.php

Yapmak için en iyi yoldur

$password_hash = hash("sha256", "iamawesome"); // 4aa4029d0d0265c566c934de4f5e0a36496c59c54b6df8a72d9c52bdf0c1a0e8

$user_entered = hash("sha256", $_POST['password']); return ($user_entered == $password_from_db);

Hashin şifrenizi güvenli olacak ..

ayrıntılı bir makale: http://wblinks.com/notes/storing-passwords-the-wrong-better-and-even-better-way