PHP şifreler Güvenli karma ve tuz

12 Cevap php

Şu anda MD5 kısmen güvenli olduğu söyleniyor. Bunu göz önünde bulundurarak, ben şifre koruması için hangi mekanizma bilmek istiyorum.

This question, Is “double hashing” a password less secure than just hashing it once? suggests that hashing multiple times may be a good idea, whereas How to implement password protection for individual files? suggests using salt.

Ben PHP kullanıyorum. Ben güvenli ve hızlı şifre şifreleme sistemi istiyor. Bir milyon kez bir parola hash daha güvenli, ama aynı zamanda daha yavaş olabilir. Nasıl hız ve emniyet arasında iyi bir denge elde etmek için? Ayrıca, karakterlerin sabit bir sayıda olması sonucu tercih ediyorum.

  1. Karma mekanizması PHP mevcut olmalıdır
  2. Bu güvenli olmalıdır
  3. (Bu durumda, eşit derecede iyi tüm tuzlar iyi tuzlarını oluşturmak için herhangi bir yolu var mı? Mı?) Bu tuzu kullanabilirsiniz

Ayrıca, veritabanında iki alan (MD5 kullanarak tek ve örneğin SHA kullanarak başka biri) muhafaza edilmelidir? Onu daha güvenli yapmak veya unsafer misiniz?

Ben yeterince açık değildi durumda, ben kullanmak için hangi bozma işlev (ler) ve nasıl güvenli ve hızlı şifre koruma mekanizması olması için iyi bir tuz almak için bilmek istiyorum.

Related questions that don't quite cover my question:

What's the difference between SHA and MD5 in PHP
Simple Password Encryption
Secure methods of storing keys, passwords for asp.net
How would you implement salted passwords in Tomcat 5.5

12 Cevap

TL;DR

Don'ts

  • Kullanıcıların şifreleri için girebileceğiniz ne karakter sınırı yok. Sadece aptallar bunu.
  • Bir şifre uzunluğunu sınırlamak etmeyin. Kullanıcıların içinde supercalifragilisticexpialidocious bir cümle istiyorsanız, bunu kullanarak engel yok.
  • Düz metin olarak kullanıcının parolasını saklamak asla.
  • Lütfen kullanıcı için bir şifre e-posta asla except when they have lost theirs, and you sent a temporary one.
  • , Şimdiye kadar herhangi bir şekilde şifreleri giriş asla.
  • SHA1 veya MD5 şifreleri karma Asla! Modern crackers 60 ve 180 milyar sağlamalarının / saniye (sırasıyla) aşabilir.

Do's

  • Zaman yapabilirsiniz scrypt kullanın; yapamazsan Bcrypt.
  • Eğer SHA2 karmaları ile, Bcrypt veya scrypt kullanabilirsiniz edemez eğer PBKDF2 kullanın.
  • Veritabanı tehlikeye olduğunda herkesin şifrelerini sıfırlayın.
  • Makul 8-10 karakter minimum uzunluğu uygulamak, artı en az 1 büyük harf 1 küçük harf, numara ve sembol gerektirir. Bu da şifre entropi, zor çatlak yapma artıracaktır. (Bazı tartışma için "Ne iyi bir şifre yapar?" Bölümüne bakın.)

Why hash passwords anyway?

Karma şifreleri arkasındaki amacı basit: veritabanı ödün tarafından kullanıcı hesaplarına kötü niyetli erişimi engelliyor. Yani şifre sağlama amacı düz metin şifreleri hesaplamak için onları çok fazla zaman ve para maliyeti bir hacker ya kraker caydırmak etmektir. Ve zaman / maliyet cephanelik iyi onleyicilerdir.

Bir kullanıcı hesapları üzerinde bir iyi, sağlam bir karma istediğiniz başka nedeni size sistemdeki tüm şifreleri değiştirmek için yeterli zaman vermek. Veritabanı veritabanındaki her şifre değiştirmek eğer, least sistemini kilitlemek de yeterli zamana ihtiyacınız olacak tehlikeye eğer.

Jeremiah Grossman, WhiteHat Güvenlik CTO, stated on his blog onun şifre koruması brute-force kırılmasını gerekli yeni şifre kurtarma sonra:

İlginçtir, bu kabus dışarı yaşayan, ben şifre kırma, depolama, ve karmaşıklığı hakkında bilmiyordum öğrendim. I’ve come to appreciate why password storage is ever so much more important than password complexity. If you don’t know how your password is stored, then all you really can depend upon is complexity. Bu şifre ve kripto profesyoneller için ortak bilgi olabilir, ama ortalama InfoSec veya Web Güvenlik uzmanı için, ben çok şüpheliyim.

(Vurgu benim.)

What makes a good password anyway?

Entropy. (Ben tam Randall bakış abone değil.)

Kısacası, entropi varyasyon şifre içinde ne kadar olduğunu. Bir şifre sadece küçük roman harf olduğunda, o sadece 26 karakter bulunuyor. O kadar varyasyon değildir. Alfa-nümerik şifreleri 36 karakterleri ile, daha iyi. Ama üst ve alt harf sağlayan, sembollerle, kabaca 96 karakterdir. Bu sadece harflerden çok daha iyi. Bir sorun bizim şifreleri biz entropi azaltır desen-hangi eklemek unutulmaz yapmak için vardır. Oops!

Şifre entropi approximated kolayca. ASCII karakter (kabaca 96 tiplendirilemeyen karakter) dizi kullanarak bir şifre 8 karakter gelecekteki güvenlikleri için hala (entropi 52,679 bit) çok düşük olduğu karakterin başına 6.6 bir entropi, verir. Ama iyi haber: uzun şifreler ve unicode karakterleri ile şifreler, gerçekten bir şifre entropi artırmak ve zor çatlamak yapmak.

Crypto StackExchange sitede şifre entropi uzun bir tartışma var. İyi bir Google arama da sonuç bir sürü kadar dönecek.

Yorumlarında ben vs X pek harfler, sayılar, semboller, X uzunluğu enforcing bir şifre politikası, aslında şifre düzeni daha öngörülebilir yaparak entropi azaltabilir dikkat çekti @ popnoodles ile konuştuk. Ben katılıyorum. Mümkün olduğu kadar tamamen rasgele Randomess, her zaman güvenli ama en unutulmaz çözümdür.

Şimdiye kadar ben söylemek mümkün oldum gibi, dünyanın en iyi şifresini yapma Catch-22 olduğunu. Onun unutulmaz değil, çok öngörülebilir, çok kısa, çok unicode karakter (hard Windows / Mobile cihazı yazmak için), ya çok uzun, vb Şifre yok bizim amaçlarımız için gerçekten yeterince iyi olduğunu, bu yüzden sanki biz onları korumak gerekir onlar Fort Knox vardı.

Best practices

Bcrypt ve scrypt mevcut en iyi uygulamalar vardır. Scrypt zamanında bcrypt daha iyi olacak, ama Linux / Unix veya webserverlarda tarafından bir standart olarak kabul görmemiştir, ve kendi algoritması gönderilmemiş derinlemesine yorumlar olmamıştır. Ama yine de, algoritmanın geleceği umut verici görünüyor. Eğer Ruby ile çalışıyorsanız olduğu bir scrypt gem size yardımcı olacaktır, ve node.js artık kendi scrypt paketi vardır.

Ben çok good wrapper Eğer bcrypt kendi kullanımını rulo istiyorsanız crypt function için belgeleri okuyarak, ya da kendinizi bulma önermek veya {[gibi bir şey kullanabilirsiniz (3)]}, daha eski uygulama için. Ben değilse 15-18, bcrypt 12 mermi az öneririz.

Ben bcrypt sadece bir değişken maliyet mekanizması ile, Blowfish'in anahtar çizelgesi kullanır öğrendim Bcrypt kullanma hakkında fikrimi değiştirdim. İkincisi sen Blowfish'in zaten pahalı anahtar çizelgesini artırarak bir şifre kaba-zorlamak için maliyet artışı sağlar.

Average practices

Neredeyse artık bu durumu hayal edemiyorum. PHPASS 5.3 ile PHP 3.0.18 destekler, bu yüzden hemen hemen her kurulum üzerinde kullanılabilen hayal-ve know for certain ortamınız Bcrypt destekler olmadığı takdirde kullanılmalıdır.

Ama hiç Bcrypt ya PHPASS kullanamazsınız varsayalım. Sonra ne?

Ortamınız / uygulama / kullanıcı-algı tahammül ki PDKBF2 maximum number of rounds ile bir uygulama deneyin. Ben tavsiye ederim düşük sayısı 2500 mermi olduğunu. Ayrıca, yeniden operasyon zorlaştırmaya varsa hash_hmac() kullandığınızdan emin olun.

Future Practices

PHP 5.5 'te gelen bir full password protection library o bcrypt ile çalışan herhangi ağrıları uzak soyutlayan olduğunu. Çoğumuz ircmaxell PHP 5.3.7 için geriye dönük uyumlu önümüzdeki API için bir compatibility layer inşa etti @, en yaygın ortamlarda PHP 5.2 ve 5.3 ile özellikle paylaşılan ana sıkışmış iken.

Cryptography Recap & Disclaimer

Aslında crack bir karma parolası yoksa gerekli hesaplama gücü. Bir parola "crack" bilgisayarlar için tek yolu, onu yeniden ve sabitlemek için kullanılan karma algoritmayı taklit etmektir. Karma hızı doğrusal kaba zorla olma yeteneği ile ilgilidir. Daha da kötüsü, çoğu karma algoritmalar kolay, daha hızlı gerçekleştirmek için parallelized edilebilir. Bcrypt ve scrypt gibi pahalı düzenleri kadar önemli olmasının nedeni budur.

Muhtemelen saldırının tüm tehditleri ya da yollar önceden tahmin edemez, ve böylece kullanıcıları korumak için en iyi çabayı up front. Bunu yapmazsanız, o zaman bile çok geç olana kadar saldırıya gerçeğini kaçırabilir ... and you're liable. Bu durumu önlemek için, başlamak için paranoyak hareket. Kendi yazılımını (dahili) saldırı ve kullanıcı kimlik bilgilerini çalmak için çalışırsanız, veya diğer kullanıcıların hesaplarını değiştirmek veya kendi veri erişim. Eğer sistem güvenliğini test yoksa, o zaman kimseyi suçlamıyorum ama kendiniz olamaz.

Son olarak: Ben bir cryptographer değilim. Ne olursa olsun ben söyledim benim görüşüm, ama iyi ol 'sağduyu ... ve okuma sürü dayanıyor düşünmek olur. Mümkün olduğunca davetsiz zor gibi şeyler yapmak, ve sonra, hala endişeli iseniz, onlar sizin kodu / sistem hakkında söylediklerini görmek için bir beyaz şapka hacker ya Cryptographer başvurun, mümkün olduğunca paranoyak olmak, unutmayın.

Bir çok daha kısa ve daha güvenli bir cevap - don't write your own password mechanism at all, denenmiş ve test edilmiş ve WordPress dahil edilir birini kullanın, Drupal vs, yani Openwall en phpass.

Çoğu programcı sadece açıklarını tanıtan olmadan güvenli kripto ilgili kod yazmak uzmanlık yok.

Quick self-test: şifre germe ve kaç tekrarlamalar kullanmanız gereken nedir? Eğer cevabı bilmiyorsanız, size GPUs and FPGAs şifreleri kırmak için uzanan şifre artık çok daha hızlı işlemciler ve kullanımı nedeniyle şifre mekanizmaları önemli bir özellik olarak, phpass kullanmalısınız (GPU'lar ile) billions of guesses per second hızlarında.

Örneğin, artık crack all 8-character Windows passwords in 6 hours PC başına 5 GPU'lar ile 5 emtia masaüstü PC'leri kullanarak yapabilirsiniz. Bu brute-zorlama yani numaralandırma ve özel karakterler de dahil olmak üzere, every 8-character Windows password kontrol ediyor ve bir sözlük saldırısı değildir. Sıradan işlemciler üzerinde çalışan ve çok hızlı olan birçok gökkuşağı tablo saldırılar da vardır. Microsoft yaptığı gibi aynı hatayı yapmayın - Camlar still doesn't salt or stretch kendi şifreleri çünkü tüm bu!

this excellent answer phpass gitmek için en iyi yoldur neden hakkında daha fazla bilgi için bkz.

Sonra sistem kullanım hash algoritmalar zayıf olarak en az zayıf olduğu için, iki farklı şekilde karma şifre saklamak olmaz.

Soru cevap olmasına rağmen, ben sadece ilk cevap olarak önerilen karma için kullanılan tuzlar e-posta adresi gibi rastgele değil, olması gerektiğini yinelemek istiyorum.

Daha fazla açıklama mevcut olan, http://www.pivotalsecurity.com/blog/password-hashing-salt-should-it-be-random/

Recently I had a discussion whether password hashes salted with random bits are more secure than the one salted with guessable or known salts. Let’s see: If the system storing password is compromised as well as the system which stores the random salt, the attacker will have access to hash as well as salt, so whether the salt is random or not, doesn’t matter. The attacker will can generate pre-computed rainbow tables to crack the hash. Here comes the interesting part- it is not so trivial to generate pre-computed tables. Let us take example of WPA security model. Your WPA password is actually never sent to Wireless Access Point. Instead, it is hashed with your SSID (the network name- like Linksys, Dlink etc). A very good explanation of how this works is here. In order to retrieve password from hash, you will need to know the password as well as salt (network name). Church of Wifi has already pre-computed hash tables which has top 1000 SSIDs and about 1 million passwords. The size is of all tables is about 40 GB. As you can read on their site, someone used 15 FGPA arrays for 3 days to generate these tables. Assuming victim is using the SSID as “a387csf3″ and password as “123456″, will it be cracked by those tables? No! .. it cannot. Even if the password is weak, the tables don’t have hashes for SSID a387csf3. This is the beauty of having random salt. It will deter crackers who thrive upon pre-computed tables. Can it stop a determined hacker? Probably not. But using random salts does provide additional layer of defense. While we are on this topic, let us discuss additional advantage of storing random salts on a separate system. Scenario #1 : Password hashes are stored on system X and salt values used for hashing are stored on system Y. These salt values are guessable or known (e.g. username) Scenario#2 : Password hashes are stored on system X and salt values used for hashing are stored on system Y. These salt values are random. In case system X has been compromised, as you can guess, there is a huge advantage of using random salt on a separate system (Scenario #2) . The attacker will need to guess addition values to be able to crack hashes. If a 32 bit salt is used, 2^32= 4,294,967,296 (about 4.2 billion) iterations will can be required for each password guessed.

Robert K'ın cevap ile rekabet yakın gelebilir asla ama ben sadece PHP 5.5 (Henüz bu yazı anda serbest olarak) bir password hashing API O (crypt etrafında sarıcı sağlar içereceğini işaret etmek istiyorum .) Bu API significanly, karma doğrulama ve şifre sağlamalarının rehashing görevini kolaylaştırır. Yazar ayrıca bir compatibility pack (sadece kullanmak için gerekli bir tek password.php dosya biçiminde), daha sonra PHP 5.3.7 kullanan ve bu ve şimdi bu hakkı kaldıraç istiyorum yayımladı.

Bu sadece şimdi için Bcrypt destekler, ancak kolayca başka bir şifre karma teknikler dahil etmek uzatılabilir amaçlayan ve tekniği ve maliyet karma parçası olarak saklanır çünkü, tercih ettiğiniz karma tekniği / maliyet değişiklikleri, çerçeve mevcut sağlamalarının geçersiz olmaz doğrulanırken automagically, doğru teknik / maliyet kullanmak olacaktır. Açıkça kendi tanımlamak yoksa o da bir "güvenli" tuz üreten yönetir.

API dört fonksiyonları sunar:

  • password_get_info () - Verilen karma hakkında bilgi döndürür
  • password_hash () - Bir parola karma yaratır
  • Verilen karma verilen seçenekler eşleşirse kontrolleri - () password_needs_rehash. Karma gerekirse rehash sağlayarak mevcut teknik / maliyet planına uygun olup olmadığını kontrol etmek yararlı
  • password_verify () - Bir şifre karma maçlar doğrular

Şu anda bu işlevler şu anda eşanlamlıdır PASSWORD_BCRYPT ve PASSWORD_DEFAULT şifre sabitler, kabul, fark PASSWORD_DEFAULT "yeni, güçlü karma algoritmalar desteklendiği zaman yeni PHP sürümlerde değişebilir." Olma PASSWORD_DEFAULT ve oturum açma password_needs_rehash () kullanarak (ve gerekirse rehashing) sizin sağlamalarının sizin için hiçbir çalışma çok az kaba kuvvet saldırılarına karşı oldukça esnek olmasını sağlamalıdır.

EDIT: Ben sadece bu Robert K'ın cevap kısaca açıklanan fark, spam üzgünüm. Ben o çalışır ve kullanım kolaylığı, güvenlik bilmiyorum olanlar için nasıl sağladığını hakkında biraz daha fazla bilgi sağlar düşünüyorum çünkü burada bu cevabı bırakacağım.

Neredeyse her PHP projesinde çok kolay uygulanabilecek basit bir dosya PHP sınıfı Phpass hangi kullanıyorum. Ayrıca bakınız The H.

Varsayılan olarak bcrypt ve Wordpress gibi çerçeveler için geriye dönük uyumluluk sağlamak için MD5 geri aşağı diğer şifreleme düşüyor Phpass, uygulanan güçlü kullanılabilir şifreleme kullanılmaktadır.

Olduğu gibi dönen karma veritabanında saklanabilir. Karma üretmek için örnek kullanımı:

$t_hasher = new PasswordHash(8, FALSE);
$hash = $t_hasher->HashPassword($password);

Parolanızı doğrulamak için, birini kullanabilirsiniz:

$t_hasher = new PasswordHash(8, FALSE);
$check = $t_hasher->CheckPassword($password, $hash);

Google SHA256 PHP mevcut olduğunu söylüyor.

Sen kesinlikle bir tuz kullanmalıdır. Ben rastgele bayt kullanmanızı öneririz (karakterler ve sayılar için kendinizi kısıtlamayın) olur. Gibi, genellikle, uzun seçerseniz seçin, daha güvenli, daha yavaş onu alır. 64 byte ince olmalı, sanırım.

Ben genellikle kullanıcı kimliğine (veya diğer bazı bilgi kullanıcı belirli bir parçası) ile SHA1 ve tuz kullanmak ve bazen ek olarak (yani tuz 2 parça var) sabit bir tuz kullanın.

SHA1 şimdi de biraz taviz, ama kabul MD5 daha çok az derecede edilir. Bir tuz (herhangi bir tuz) kullanarak, rainbow table (bazı insanlar bile karma arayarak gökkuşağı tablo bir tür olarak Google'ı kullanarak bir başarı oldu) sizin sağlamalarının saldırmak için bir jenerik kullanılmasını engelleyen ediyoruz . Saldırgan, makul sizin tuz kullanarak bir gökkuşağı tablo oluşturabilir, böylece bir kullanıcı-spesifik tuz içermelidir yüzden. Bu şekilde, tüm sistem için bir değil, sadece, sistem içinde her kayıt için bir gökkuşağı tablo oluşturmak zorunda kalacak! Tuzlama türü ile, hatta MD5 terbiyeli güvenlidir.

Sonunda, çift-karma, matematiksel, hiçbir fayda sağlar. Ancak uygulamada, bu gökkuşağı tablo tabanlı saldırıları önlemek için yararlıdır. Diğer bir deyişle, bu uygulama veya sunucu üzerinde çok daha az işlemci zaman alır bir tuz ile karma daha fazla fayda sağlar.

SHA1 ve tuz öngörülebilir gelecekte (siz Fort Knox ya da alışveriş listeniz için bir giriş sistemi için bir şey kodlama olmanıza, doğal olarak) yeterli olacaktır. SHA1 Eğer kullanmak için yeterince iyi değil SHA256. Eğer

Bir tuz fikri diyecek kadar, nazım karma sonuçları atmak etmektir. Bu boş bir dize MD5 hash d41d8cd98f00b204e9800998ecf8427e olduğunu, örneğin, bilinir. Yani, bir bellek yeterince iyi birisi olduğunu hash görmek ve boş bir dize karma olduğunu bilseydin. Ancak dize, 'boş string' için karma (yani "MY_PERSONAL_SALT") (string "MY_PERSONAL_SALT" ile, diyelim ki) tuzlu ise {olur [(3)] }, bu nedenle non-belirgin takip etmeleride. Ben değil daha, any tuz kullanmak için daha iyi olduğunu, söylemeye çalışıyorum ne. Bu nedenle, which tuz kullanmayı bilmek bir önemi çok fazla değil.

Aslında vardır websites that do just this - bunu (md5) hash besleyebilir, ve o belirli karma oluşturduğu bilinen bir metne dışarı tükürür. Düz md5-karmaları depolayan bir veritabanına erişim olsun istiyorum eğer böyle bir hizmet için admin için karma girin ve oturum Fakat, şifreler tuzlu olsaydı, böyle bir hizmet olacak için, bu önemsiz olurdu etkisiz.

Bu sonuç alan azalır çünkü Ayrıca, çift karma genellikle kötü bir yöntem olarak kabul edilir. Tüm popüler sağlamalarının uzunluğu sabittir. Bu nedenle, bu sabit uzunluğunun sadece bir sonlu değerlere sahip olabilir ve sonuçlar, daha az çeşitli hale gelir. Bu could tuzlama başka bir formu olarak kabul edilebilir, ama ben bunu tavsiye etmem.

Ben burada bu konuda mükemmel bir konu bulunamadı: https://crackstation.net/hashing-security.htm, burada kaynak kodu aynı zamanda zaman tabanlı saldırılara karşı şartıyla önlenmesi, ondan fayda almak istedim.

<?php
/*
 * Password hashing with PBKDF2.
 * Author: havoc AT defuse.ca
 * www: https://defuse.ca/php-pbkdf2.htm
 */

// These constants may be changed without breaking existing hashes.
define("PBKDF2_HASH_ALGORITHM", "sha256");
define("PBKDF2_ITERATIONS", 1000);
define("PBKDF2_SALT_BYTES", 24);
define("PBKDF2_HASH_BYTES", 24);

define("HASH_SECTIONS", 4);
define("HASH_ALGORITHM_INDEX", 0);
define("HASH_ITERATION_INDEX", 1);
define("HASH_SALT_INDEX", 2);
define("HASH_PBKDF2_INDEX", 3);

function create_hash($password)
{
    // format: algorithm:iterations:salt:hash
    $salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTES, MCRYPT_DEV_URANDOM));
    return PBKDF2_HASH_ALGORITHM . ":" . PBKDF2_ITERATIONS . ":" .  $salt . ":" . 
        base64_encode(pbkdf2(
            PBKDF2_HASH_ALGORITHM,
            $password,
            $salt,
            PBKDF2_ITERATIONS,
            PBKDF2_HASH_BYTES,
            true
        ));
}

function validate_password($password, $good_hash)
{
    $params = explode(":", $good_hash);
    if(count($params) < HASH_SECTIONS)
       return false; 
    $pbkdf2 = base64_decode($params[HASH_PBKDF2_INDEX]);
    return slow_equals(
        $pbkdf2,
        pbkdf2(
            $params[HASH_ALGORITHM_INDEX],
            $password,
            $params[HASH_SALT_INDEX],
            (int)$params[HASH_ITERATION_INDEX],
            strlen($pbkdf2),
            true
        )
    );
}

// Compares two strings $a and $b in length-constant time.
function slow_equals($a, $b)
{
    $diff = strlen($a) ^ strlen($b);
    for($i = 0; $i < strlen($a) && $i < strlen($b); $i++)
    {
        $diff |= ord($a[$i]) ^ ord($b[$i]);
    }
    return $diff === 0; 
}

/*
 * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt
 * $algorithm - The hash algorithm to use. Recommended: SHA256
 * $password - The password.
 * $salt - A salt that is unique to the password.
 * $count - Iteration count. Higher is better, but slower. Recommended: At least 1000.
 * $key_length - The length of the derived key in bytes.
 * $raw_output - If true, the key is returned in raw binary format. Hex encoded otherwise.
 * Returns: A $key_length-byte key derived from the password and salt.
 *
 * Test vectors can be found here: https://www.ietf.org/rfc/rfc6070.txt
 *
 * This implementation of PBKDF2 was originally created by https://defuse.ca
 * With improvements by http://www.variations-of-shadow.com
 */
function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false)
{
    $algorithm = strtolower($algorithm);
    if(!in_array($algorithm, hash_algos(), true))
        die('PBKDF2 ERROR: Invalid hash algorithm.');
    if($count <= 0 || $key_length <= 0)
        die('PBKDF2 ERROR: Invalid parameters.');

    $hash_length = strlen(hash($algorithm, "", true));
    $block_count = ceil($key_length / $hash_length);

    $output = "";
    for($i = 1; $i <= $block_count; $i++) {
        // $i encoded as 4 bytes, big endian.
        $last = $salt . pack("N", $i);
        // first iteration
        $last = $xorsum = hash_hmac($algorithm, $last, $password, true);
        // perform the other $count - 1 iterations
        for ($j = 1; $j < $count; $j++) {
            $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
        }
        $output .= $xorsum;
    }

    if($raw_output)
        return substr($output, 0, $key_length);
    else
        return bin2hex(substr($output, 0, $key_length));
}
?>

THINGS TO REMEMBER

Çok çok iyi bir tavsiyedir çoğu PHP, için şifre şifreleme hakkında dedi, ama sen bile şifre şifreleme için PHP kullanarak işlemini başlamadan önce emin aşağıdaki uygulanan veya uygulanmaya hazır hale olmuştur.

SERVER

PORTS

Olursa olsun düzgün tüm çabaları değersiz PHP ve DB çalışan sunucunun güvenliğini yoksa şifreleme ne kadar iyi. Sunucuların çoğu onlar ya ftp veya kabuk yoluyla uzaktan onlara erişmek için izin verilen bağlantı noktaları, nispeten aynı şekilde çalışır. Eğer sahip olduğunuz aktif Hiç uzak bağlantı varsayılan bağlantı noktasını değiştirmek emin olun. Bu yapmıyorum siz yürürlükte saldırganın sisteme erişen bir daha adımı yaptık.

USERNAME

Dünyada iyi olduğunu tüm username admin, kök veya benzeri bir şey kullanmak değilsiniz. Bir Unix tabanlı bir sistem üzerinde root hesabı açma erişilebilir YAPMAYIN Ayrıca, her zaman sadece sudo olmalıdır.

PASSWORD

Sen aynı şeyi, kesmek almamak için iyi şifreleri yapmak için kullanıcıları söyle. Eğer arka kapı açık olduğunda ön kapı kilitleme tüm çaba geçmekte nokta nedir.

DATABASE

SERVER

İdeal ayrı sunucularda üzerinde DB ve UYGULAMA istiyorum. Bu maliyet nedeniyle her zaman mümkün değildir, ancak saldırganın tamamen sisteme erişmek için iki adım adım gitmek zorunda kalacak gibi bazı güvenlik için izin vermiyor.

USER

Her zaman uygulama DB erişmek için kendi hesabınızın olması ve sadece bunu çok ihtiyacın olacak ayrıcalıkları verin.

Sonra bu bile uygulamada, herhangi bir sunucuda depolanan değil sizin için ayrı bir kullanıcı hesabı var.

Her zaman olduğu gibi, bu kök ya da benzer bir şey yapmak ETMEYİN.

PASSWORD

Tüm iyi şifreleri ile olduğu gibi aynı kuralları uygulayın. Ayrıca aynı sistem üzerinde herhangi bir sunucu veya DB hesaplarında aynı şifreyi kullanmamanız.

PHP

PASSWORD

EVER, DB bir parolayı depolamak yerine karma ve eşsiz tuz saklamak ASLA, ben neden daha sonra açıklayacağız.

HASHING

ONE WAY Kıyımlama!!!, Bu tersine çevrilebilir bir şekilde bir parola hash Asla sağlamalarını bunları ters ve şifre bunları karşılaştırmak yok, yani tek yönlü olmalı, yerine girdiğiniz şifreyi hash aynı şekilde ve iki sağlamalarının karşılaştırın. Bu, bir saldırganın DB erişim alır bile o aslında parola sadece kendi sonuçtaki müzakere, ne olduğunu bilmiyor demektir. Hangi kötü senaryoda kullanıcılar için daha fazla güvenlik demektir.

Orada iyi karma bir çok fonksiyonu (vb .., password_hash, hash) orada ama etkili olması için karma için iyi bir algoritma seçmeniz gerekir. (Bcrypt ve buna benzer olanlar iyi algoritmaları vardır.)

Hızını karma anahtar, Brute Force saldırıları yavaş daha dirençli olduğu zaman.

Karma en yaygın hatalardan biri sağlamalarının kullanıcılarına eşsiz olmamasıdır. Bu tuzlar benzersiz değil oluşturulur başlıca nedeni olduğunu.

SALTING

Parolalar her zaman karma önce tuzlu olmalıdır. Tuzlama kadar benzer parolalar DB aynı görünmüyor şifre rastgele bir dize ekler. Tuz her kullanıcı için benzersiz değilse Ancak: Eğer oldukça fazla tuz değersiz yaptık daha (yani sabit kodlanmış tuz kullanın). Bir zamanlar bir saldırganın tek bir şifre tuz rakamlar çünkü hepsi için tuz vardır.

Bir tuz emin o tuzlama olduğu şifre benzersiz yapmak oluşturduğunuzda, sonra DB tamamlanan karma ve tuz hem saklayın. Bu ne yapacağız onlar erişebilir önce bir saldırganın tek tek her bir tuz ve karma çatlamak böylece bunu yapmak değildir. Bu çok daha fazla iş ve saldırgan için zaman anlamına gelir.

USERS CREATING PASSWORDS

Kullanıcı önyüz üzerinden bir parola oluşturmak ise o sunucuya gönderilecek anlamına gelir. Bu parolanın şifrelenmemiş sunucuya gönderiliyor ve bir saldırganın dinlemek ve erişim mümkün ise PHP tüm güvenlik değersiz olduğu anlamına gelir, çünkü bu bir güvenlik sorunu açılır. DAİMA GÜVENLİ, bu SSL aracılığıyla yapılır veri iletimi, ama yorgun olması bile SSL (OpenSSL Heartbleed kusur, bu bir örnektir) kusursuz değildir.

Ayrıca kullanıcı güvenli bir parola oluşturmak yapmak, bu kullanıcı sonunda bunun için minnettar olacaktır, basit ve her zaman yapılmalıdır.

Son olarak, ne olursa olsun hiçbir şey almak güvenlik önlemleri% 100 güvenli, daha korumak için ileri teknoloji daha atak hale gelişmiş olur. Ancak bu adımları izleyerek sitenizi daha güvenli ve çok daha az arzu saldırganların peşine için yapacaktır.