পাসওয়ার্ডগুলি হ্যাশ এবং যাচাই করতে কীভাবে পিএইচপি এর পাসওয়ার্ড_হ্যাশ ব্যবহার করবেন


94

সম্প্রতি আমি ইন্টারনেটে হোঁচট খেয়েছি এমন একটি লগ ইন স্ক্রিপ্টে নিজের সুরক্ষা বাস্তবায়নের চেষ্টা করছি। প্রতিটি ব্যবহারকারীর জন্য লবণ তৈরি করার জন্য কীভাবে আমার নিজের স্ক্রিপ্ট তৈরি করতে হয় তা শেখার চেষ্টা করার পরে, আমি হোঁচট খেয়েছি password_hash

আমি যা বুঝতে পারি তা থেকে ( এই পৃষ্ঠায় পাঠের ভিত্তিতে ) আপনি যখন ব্যবহার করবেন তখনই সারণীতে লবণ ইতিমধ্যে উত্পন্ন হয় password_hash। এটা কি সত্য?

আমার আরেকটি প্রশ্ন ছিল, 2 টি সল্ট কি স্মার্ট হবে না? একটি সরাসরি ফাইল এবং একটি ডিবি? এইভাবে, কেউ যদি ডিবিতে আপনার নুনের সাথে আপোষ করে তবে আপনার কাছে এখনও ফাইলটিতে সরাসরি আছে? আমি এখানে পড়লাম যে সল্ট সংরক্ষণ করা কখনও স্মার্ট ধারণা নয়, তবে এটি সর্বদা আমাকে বিভ্রান্ত করে যে এর দ্বারা লোকেরা কী বোঝায়।


8
না। ফাংশনটি লবণের যত্ন নেওয়া উচিত। ডাবল সল্টিং আপনাকে সমস্যায় ফেলবে এবং এর প্রয়োজন নেই।
ফানকি চল্লিশ নিনার

উত্তর:


182

password_hashপাসওয়ার্ড সংরক্ষণের প্রস্তাবিত উপায়টি ব্যবহার করা। এগুলি ডিবি এবং ফাইলগুলিতে পৃথক করবেন না।

ধরা যাক আমাদের নিম্নলিখিত ইনপুট রয়েছে:

$password = $_POST['password'];

আপনি প্রথমে এটি করে পাসওয়ার্ডটি হ্যাশ করুন:

$hashed_password = password_hash($password, PASSWORD_DEFAULT);

তারপরে আউটপুটটি দেখুন:

var_dump($hashed_password);

আপনি দেখতে পাচ্ছেন এটি হ্যাশ হয়েছে। (আমি ধরে নিই যে আপনি এই পদক্ষেপগুলি করেছেন)।

আপনার পাসওয়ার্ড কলামটি হ্যাশ মান (কমপক্ষে characters০ টি অক্ষর বা তার বেশি) ধরে রাখতে যথেষ্ট যথেষ্ট তা নিশ্চিত করে এখন আপনি এই হ্যাশ পাসওয়ার্ডটি আপনার ডাটাবেজে সংরক্ষণ করেন । যখন কোনও ব্যবহারকারী তাদের লগ ইন করতে বলে, আপনি এটি করে ডাটাবেজে এই হ্যাশ মানটির সাথে পাসওয়ার্ড ইনপুটটি পরীক্ষা করে দেখুন:

// Query the database for username and password
// ...

if(password_verify($password, $hashed_password)) {
    // If the password inputs matched the hashed password in the database
    // Do something, you know... log them in.
} 

// Else, Redirect them back to the login page.

অফিসিয়াল রেফারেন্স


4
ঠিক আছে, আমি এটি চেষ্টা করেছি এবং এটি কাজ করেছে। আমি ফাংশনটি সন্দেহ করেছিলাম কারণ এটি প্রায় খুব সহজ বলে মনে হয়েছিল। আপনি আমার বারচারের দৈর্ঘ্য কতক্ষণ বাড়ানোর পরামর্শ দিচ্ছেন? 225?
জোশ পটার

4
এটি ইতিমধ্যে php.net/manual/en/function.password-hash.php --- php.net/manual/en/function.password-verify.php ম্যানুয়ালগুলিতে রয়েছে যা ওপি সম্ভবত পড়েনি বা বুঝতে পারে নি। এই প্রশ্নটি কারও চেয়ে বেশি বার জিজ্ঞাসা করা হয়েছিল।
ফানকি চল্লিশটি নাইনার

এটি একটি ভিন্ন পৃষ্ঠা
জোশ পটার

@ জোশপোটার কি থেকে আলাদা? এছাড়াও, লক্ষ্য করা গেছে যে তারা আপনার দ্বিতীয় প্রশ্নের জবাব দেয় নি। তারা সম্ভবত নিজেকে খুঁজে বের করার প্রত্যাশা করছেন, বা তারা জানেন না।
ফানকি চল্লিশ নিনার

8
@ ফঙ্কফর্টিনিয়ার, খ / সি জোশ প্রশ্নটি করেছিল, আমি এটি পেয়েছি, ২ বছর পরে, এবং এটি আমাকে সাহায্য করেছিল helped এটি এসও এর পয়েন্ট। সেই ম্যানুয়ালটি মাটির মতো পরিষ্কার।
টুডমো

23

হ্যাঁ আপনি এটি সঠিকভাবে বুঝতে পেরেছেন, ফাংশন পাসওয়ার্ড_হ্যাশ () নিজে থেকে একটি লবণ উত্পন্ন করবে এবং ফলাফলযুক্ত হ্যাশ-মানটিতে এটি অন্তর্ভুক্ত করবে। ডাটাবেসে লবণ সংরক্ষণ করা একেবারে সঠিক, জানা থাকলেও এটি কাজ করে।

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($_POST['password'], $existingHashFromDb);

আপনি উল্লিখিত দ্বিতীয় লবণটি (একটি ফাইলের মধ্যে সঞ্চিত) আসলে মরিচ বা সার্ভারের পাশের কী। যদি আপনি এটি হ্যাশিংয়ের আগে (লবণের মতো) যোগ করেন তবে আপনি একটি মরিচ যোগ করুন। এর চেয়ে আরও ভাল উপায় আছে তবে আপনি প্রথমে হ্যাশ গণনা করতে পারবেন এবং তারপরে সার্ভার-সাইড কী সহ হ্যাশ এনক্রিপ্ট (দ্বি-মুখী) করতে পারেন। এটি আপনাকে প্রয়োজনে কীটি পরিবর্তন করার সম্ভাবনা দেয় gives

লবণের বিপরীতে, এই কীটি গোপন রাখা উচিত। লোকেরা প্রায়শই এটি মিশ্রিত করে এবং লবণটি আড়াল করার চেষ্টা করে তবে লবণটি তার কাজটি করতে দেওয়া এবং একটি কী দিয়ে গোপনীয়তা যুক্ত করা ভাল।


8

হ্যাঁ এটা সত্য. আপনি ফাংশনটিতে পিএইচপি FAQ সন্দেহ করছেন কেন? :)

দৌড়ের ফলাফলের password_hash()চারটি অংশ রয়েছে:

  1. ব্যবহৃত অ্যালগরিদম
  2. পরামিতি
  3. লবণ
  4. আসল পাসওয়ার্ড হ্যাশ

সুতরাং আপনি দেখতে পাচ্ছেন, হ্যাশ এটির একটি অংশ।

অবশ্যই, আপনার বাড়তি সুরক্ষার জন্য অতিরিক্ত লবণ থাকতে পারে, তবে আমি সত্যিই মনে করি নিয়মিত পিএইচপি অ্যাপ্লিকেশনটিতে ওভারকিল। ডিফল্ট বিক্রিপট অ্যালগরিদম ভাল, এবং blowচ্ছিক ব্লো ফিশ তর্কাত্মকভাবে আরও ভাল।


4
বিসিক্রিপ হ্যাশিং ফাংশন, অন্যদিকে ব্লোফিশ এনক্রিপশনের জন্য একটি অ্যালগরিদম । বিসিপ্রিপ্ট যদিও ব্লোফিশ আলগোরিদম থেকে উদ্ভূত।
মার্টিনস্টোইকেলি

7

আপনার পাসওয়ার্ড সুরক্ষিত করার জন্য কখনও এমডি 5 () ব্যবহার করবেন না এমনকি লবণ দিয়েও, এটি সর্বদা বিপজ্জনক !!

নীচের মত সর্বশেষ হ্যাশিং অ্যালগরিদম দিয়ে আপনার পাসওয়ার্ড সুরক্ষিত করুন।

<?php

// Your original Password
$password = '121@121';

//PASSWORD_BCRYPT or PASSWORD_DEFAULT use any in the 2nd parameter
/*
PASSWORD_BCRYPT always results 60 characters long string.
PASSWORD_DEFAULT capacity is beyond 60 characters
*/
$password_encrypted = password_hash($password, PASSWORD_BCRYPT);

ডাটাবেসের এনক্রিপ্ট করা পাসওয়ার্ড এবং ব্যবহারকারীর ইনপুটযুক্ত পাসওয়ার্ডের সাথে মিলের জন্য নীচের ফাংশনটি ব্যবহার করুন।

<?php 

if (password_verify($password_inputted_by_user, $password_encrypted)) {
    // Success!
    echo 'Password Matches';
}else {
    // Invalid credentials
    echo 'Password Mismatch';
}

আপনি যদি নিজের নিজস্ব লবণ ব্যবহার করতে চান তবে তার জন্য আপনার কাস্টম উত্পন্ন ফাংশনটি ব্যবহার করুন, কেবল নীচে অনুসরণ করুন, তবে আমি এটির প্রস্তাব দিচ্ছি না কারণ এটি পিএইচপি-র সর্বশেষ সংস্করণে অবচয় হিসাবে পাওয়া গেছে।

নীচের কোড ব্যবহার করার আগে পাসওয়ার্ড_হ্যাশ () সম্পর্কে পড়ুন ।

<?php

$options = [
    'salt' => your_custom_function_for_salt(), 
    //write your own code to generate a suitable & secured salt
    'cost' => 12 // the default cost is 10
];

$hash = password_hash($your_password, PASSWORD_DEFAULT, $options);

4
লবণের বিকল্পটি ভাল কারণে নষ্ট করা হয়, কারণ ফাংশনটি ক্রিপ্টোগ্রাফিকভাবে নিরাপদ লবণের পক্ষে সর্বোত্তমভাবে কাজ করে এবং এটি আরও ভাল করে করা প্রায় অসম্ভব।
মার্টিনস্টোএকলি

@ মার্টিনস্টোকেলি, হ্যাঁ আপনি ঠিক বলেছেন, আমি আমার উত্তরটি সবেমাত্র আপডেট করেছি, ধন্যবাদ!
মহেশ যাদব

যদি (আইসেট ($ _ পোষ্ট ['বিটিএন-সাইনআপ'])) {ame আনাম = মাইএসকিএল_ রিয়েল_সেকপে_ স্ট্রিং ($ _ পোষ্ট ['আনমেন']); $ ইমেল = mysql_real_escape_string ($ _ পোস্ট ['ইমেল']); ass upass = md5 (mysql_real_escape_string ($ _ পোস্ট ['পাস'])); এটি লগইন.এফপি ব্যবহার করা কোড .. আমি পালাতে এবং এমডি 5 ব্যবহার না করেই করতে চাই। আমি পাসওয়ার্ড হ্যাশ ব্যবহার করতে চাই ..
রশ্মি এসএম

পাসওয়ার্ড_ডিএফএলটি - বিসিআরপিট অ্যালগরিদম ব্যবহার করুন (পিএইচপি 5.5.0 প্রয়োজন)। নোট করুন যে এই ধ্রুবকটি সময়ের সাথে পরিবর্তনের জন্য ডিজাইন করা হয়েছে কারণ পিএইচপি-তে নতুন এবং শক্তিশালী অ্যালগরিদম যুক্ত করা হয়। যে কারণে, এই সনাক্তকারী ব্যবহার করে ফলাফলের দৈর্ঘ্য সময়ের সাথে সাথে পরিবর্তিত হতে পারে।
অ্যাড্রিয়ান পি।

5

পিএইচপি এর পাসওয়ার্ড ফাংশনগুলিতে অন্তর্নির্মিত পিছনে এবং ফরোয়ার্ডের সামঞ্জস্যতার বিষয়ে আলাদা আলাদা আলোচনার অভাব রয়েছে। লক্ষণীয়ভাবে:

  1. পিছনের সামঞ্জস্যতা: পাসওয়ার্ড ফাংশনগুলি মূলত চারপাশে একটি ভালভাবে লেখা র‌্যাপার হয় crypt()এবং এগুলি crypt()অপ্রচলিত এবং / অথবা নিরাপত্তাহীন হ্যাশ অ্যালগরিদমগুলি ব্যবহার করলেও, ফর্ম্যাট হ্যাশগুলির সাথে সহজাতভাবে পিছনের দিকে সামঞ্জস্য হয় ।
  2. ফরোয়ার্ডের সামঞ্জস্যপূর্ণতা:password_needs_rehash() আপনার প্রমাণীকরণের ওয়ার্কফ্লোতে সন্নিবেশ করা এবং কিছুটা যুক্তি আপনাকে ওয়ার্কফ্লোতে সম্ভাব্য শূন্যের ভবিষ্যতের পরিবর্তনের সাথে বর্তমান এবং ভবিষ্যতের অ্যালগরিদমের সাথে আপনার হ্যাশগুলি আপ টু ডেট রাখতে পারে। দ্রষ্টব্য: নির্দিষ্ট অ্যালগরিদমের সাথে মেলে না এমন কোনও স্ট্রিং নন-ক্রিপ্ট-সামঞ্জস্যপূর্ণ হ্যাশ সহ একটি পুনঃস্থাপনের জন্য পতাকাঙ্কিত করা হবে।

যেমন:

class FakeDB {
    public function __call($name, $args) {
        printf("%s::%s(%s)\n", __CLASS__, $name, json_encode($args));
        return $this;
    }
}

class MyAuth {
    protected $dbh;
    protected $fakeUsers = [
        // old crypt-md5 format
        1 => ['password' => '$1$AVbfJOzY$oIHHCHlD76Aw1xmjfTpm5.'],
        // old salted md5 format
        2 => ['password' => '3858f62230ac3c915f300c664312c63f', 'salt' => 'bar'],
        // current bcrypt format
        3 => ['password' => '$2y$10$3eUn9Rnf04DR.aj8R3WbHuBO9EdoceH9uKf6vMiD7tz766rMNOyTO']
    ];

    public function __construct($dbh) {
        $this->dbh = $dbh;
    }

    protected function getuser($id) {
        // just pretend these are coming from the DB
        return $this->fakeUsers[$id];
    }

    public function authUser($id, $password) {
        $userInfo = $this->getUser($id);

        // Do you have old, turbo-legacy, non-crypt hashes?
        if( strpos( $userInfo['password'], '$' ) !== 0 ) {
            printf("%s::legacy_hash\n", __METHOD__);
            $res = $userInfo['password'] === md5($password . $userInfo['salt']);
        } else {
            printf("%s::password_verify\n", __METHOD__);
            $res = password_verify($password, $userInfo['password']);
        }

        // once we've passed validation we can check if the hash needs updating.
        if( $res && password_needs_rehash($userInfo['password'], PASSWORD_DEFAULT) ) {
            printf("%s::rehash\n", __METHOD__);
            $stmt = $this->dbh->prepare('UPDATE users SET pass = ? WHERE user_id = ?');
            $stmt->execute([password_hash($password, PASSWORD_DEFAULT), $id]);
        }

        return $res;
    }
}

$auth = new MyAuth(new FakeDB());

for( $i=1; $i<=3; $i++) {
    var_dump($auth->authuser($i, 'foo'));
    echo PHP_EOL;
}

আউটপুট:

MyAuth::authUser::password_verify
MyAuth::authUser::rehash
FakeDB::prepare(["UPDATE users SET pass = ? WHERE user_id = ?"])
FakeDB::execute([["$2y$10$zNjPwqQX\/RxjHiwkeUEzwOpkucNw49yN4jjiRY70viZpAx5x69kv.",1]])
bool(true)

MyAuth::authUser::legacy_hash
MyAuth::authUser::rehash
FakeDB::prepare(["UPDATE users SET pass = ? WHERE user_id = ?"])
FakeDB::execute([["$2y$10$VRTu4pgIkGUvilTDRTXYeOQSEYqe2GjsPoWvDUeYdV2x\/\/StjZYHu",2]])
bool(true)

MyAuth::authUser::password_verify
bool(true)

চূড়ান্ত নোট হিসাবে, আপনি কেবলমাত্র লগইনে কোনও ব্যবহারকারীর পাসওয়ার্ড পুনরায় হ্যাশ করতে পারবেন আপনার ব্যবহারকারীদের সুরক্ষার জন্য আপনার "সুরক্ষিত" সুরক্ষিত সুরক্ষিত উত্তরাধিকারের হ্যাশগুলি বিবেচনা করা উচিত। এর অর্থ আমার অর্থ এই যে কোনও নির্দিষ্ট অনুগ্রহের পরে আপনি সমস্ত অনিরাপদ [যেমন: খালি এমডি 5 / এসএএএ / অন্যথায় দুর্বল] হ্যাশগুলি সরিয়ে ফেলেন এবং আপনার ব্যবহারকারীদের আপনার অ্যাপ্লিকেশনটির পাসওয়ার্ড পুনরায় সেট করার প্রক্রিয়াতে নির্ভর করতে পারেন।


0

শ্রেণীর পাসওয়ার্ড পূর্ণ কোড:

Class Password {

    public function __construct() {}


    /**
     * Hash the password using the specified algorithm
     *
     * @param string $password The password to hash
     * @param int    $algo     The algorithm to use (Defined by PASSWORD_* constants)
     * @param array  $options  The options for the algorithm to use
     *
     * @return string|false The hashed password, or false on error.
     */
    function password_hash($password, $algo, array $options = array()) {
        if (!function_exists('crypt')) {
            trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING);
            return null;
        }
        if (!is_string($password)) {
            trigger_error("password_hash(): Password must be a string", E_USER_WARNING);
            return null;
        }
        if (!is_int($algo)) {
            trigger_error("password_hash() expects parameter 2 to be long, " . gettype($algo) . " given", E_USER_WARNING);
            return null;
        }
        switch ($algo) {
            case PASSWORD_BCRYPT :
                // Note that this is a C constant, but not exposed to PHP, so we don't define it here.
                $cost = 10;
                if (isset($options['cost'])) {
                    $cost = $options['cost'];
                    if ($cost < 4 || $cost > 31) {
                        trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING);
                        return null;
                    }
                }
                // The length of salt to generate
                $raw_salt_len = 16;
                // The length required in the final serialization
                $required_salt_len = 22;
                $hash_format = sprintf("$2y$%02d$", $cost);
                break;
            default :
                trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING);
                return null;
        }
        if (isset($options['salt'])) {
            switch (gettype($options['salt'])) {
                case 'NULL' :
                case 'boolean' :
                case 'integer' :
                case 'double' :
                case 'string' :
                    $salt = (string)$options['salt'];
                    break;
                case 'object' :
                    if (method_exists($options['salt'], '__tostring')) {
                        $salt = (string)$options['salt'];
                        break;
                    }
                case 'array' :
                case 'resource' :
                default :
                    trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING);
                    return null;
            }
            if (strlen($salt) < $required_salt_len) {
                trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", strlen($salt), $required_salt_len), E_USER_WARNING);
                return null;
            } elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) {
                $salt = str_replace('+', '.', base64_encode($salt));
            }
        } else {
            $salt = str_replace('+', '.', base64_encode($this->generate_entropy($required_salt_len)));
        }
        $salt = substr($salt, 0, $required_salt_len);

        $hash = $hash_format . $salt;

        $ret = crypt($password, $hash);

        if (!is_string($ret) || strlen($ret) <= 13) {
            return false;
        }

        return $ret;
    }


    /**
     * Generates Entropy using the safest available method, falling back to less preferred methods depending on support
     *
     * @param int $bytes
     *
     * @return string Returns raw bytes
     */
    function generate_entropy($bytes){
        $buffer = '';
        $buffer_valid = false;
        if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) {
            $buffer = mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM);
            if ($buffer) {
                $buffer_valid = true;
            }
        }
        if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) {
            $buffer = openssl_random_pseudo_bytes($bytes);
            if ($buffer) {
                $buffer_valid = true;
            }
        }
        if (!$buffer_valid && is_readable('/dev/urandom')) {
            $f = fopen('/dev/urandom', 'r');
            $read = strlen($buffer);
            while ($read < $bytes) {
                $buffer .= fread($f, $bytes - $read);
                $read = strlen($buffer);
            }
            fclose($f);
            if ($read >= $bytes) {
                $buffer_valid = true;
            }
        }
        if (!$buffer_valid || strlen($buffer) < $bytes) {
            $bl = strlen($buffer);
            for ($i = 0; $i < $bytes; $i++) {
                if ($i < $bl) {
                    $buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255));
                } else {
                    $buffer .= chr(mt_rand(0, 255));
                }
            }
        }
        return $buffer;
    }

    /**
     * Get information about the password hash. Returns an array of the information
     * that was used to generate the password hash.
     *
     * array(
     *    'algo' => 1,
     *    'algoName' => 'bcrypt',
     *    'options' => array(
     *        'cost' => 10,
     *    ),
     * )
     *
     * @param string $hash The password hash to extract info from
     *
     * @return array The array of information about the hash.
     */
    function password_get_info($hash) {
        $return = array('algo' => 0, 'algoName' => 'unknown', 'options' => array(), );
        if (substr($hash, 0, 4) == '$2y$' && strlen($hash) == 60) {
            $return['algo'] = PASSWORD_BCRYPT;
            $return['algoName'] = 'bcrypt';
            list($cost) = sscanf($hash, "$2y$%d$");
            $return['options']['cost'] = $cost;
        }
        return $return;
    }

    /**
     * Determine if the password hash needs to be rehashed according to the options provided
     *
     * If the answer is true, after validating the password using password_verify, rehash it.
     *
     * @param string $hash    The hash to test
     * @param int    $algo    The algorithm used for new password hashes
     * @param array  $options The options array passed to password_hash
     *
     * @return boolean True if the password needs to be rehashed.
     */
    function password_needs_rehash($hash, $algo, array $options = array()) {
        $info = password_get_info($hash);
        if ($info['algo'] != $algo) {
            return true;
        }
        switch ($algo) {
            case PASSWORD_BCRYPT :
                $cost = isset($options['cost']) ? $options['cost'] : 10;
                if ($cost != $info['options']['cost']) {
                    return true;
                }
                break;
        }
        return false;
    }

    /**
     * Verify a password against a hash using a timing attack resistant approach
     *
     * @param string $password The password to verify
     * @param string $hash     The hash to verify against
     *
     * @return boolean If the password matches the hash
     */
    public function password_verify($password, $hash) {
        if (!function_exists('crypt')) {
            trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING);
            return false;
        }
        $ret = crypt($password, $hash);
        if (!is_string($ret) || strlen($ret) != strlen($hash) || strlen($ret) <= 13) {
            return false;
        }

        $status = 0;
        for ($i = 0; $i < strlen($ret); $i++) {
            $status |= (ord($ret[$i]) ^ ord($hash[$i]));
        }

        return $status === 0;
    }

}

0

আমি পাসওয়ার্ড যাচাইকরণের জন্য এবং পাসওয়ার্ড তৈরির জন্য যেমন আমি একটি মাইএসকিউএল ডাটাবেসে সঞ্চয় করি তার জন্য আমি সমস্ত সময় ব্যবহার করি function এটি এলোমেলোভাবে উত্পন্ন লবণ ব্যবহার করে যা স্থির লবণের চেয়ে বেশি সুরক্ষিত।

function secure_password($user_pwd, $multi) {

/*
    secure_password ( string $user_pwd, boolean/string $multi ) 

    *** Description: 
        This function verifies a password against a (database-) stored password's hash or
        returns $hash for a given password if $multi is set to either true or false

    *** Examples:
        // To check a password against its hash
        if(secure_password($user_password, $row['user_password'])) {
            login_function();
        } 
        // To create a password-hash
        $my_password = 'uber_sEcUrE_pass';
        $hash = secure_password($my_password, true);
        echo $hash;
*/

// Set options for encryption and build unique random hash
$crypt_options = ['cost' => 11, 'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)];
$hash = password_hash($user_pwd, PASSWORD_BCRYPT, $crypt_options);

// If $multi is not boolean check password and return validation state true/false
if($multi!==true && $multi!==false) {
    if (password_verify($user_pwd, $table_pwd = $multi)) {
        return true; // valid password
    } else {
        return false; // invalid password
    }
// If $multi is boolean return $hash
} else return $hash;

}

6
saltপরামিতি বাদ দেওয়া ভাল , এটি সেরা অনুশীলনগুলি অনুসরণ করে পাসওয়ার্ড_হ্যাশ () ফাংশন দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন হবে । এর পরিবর্তে ভবিষ্যতের প্রুফ কোড লিখতে PASSWORD_BCRYPTব্যবহার করতে পারেন PASSWORD_DEFAULT
মার্টিনস্টোইকেলি

পরামর্শের জন্য ধন্যবাদ। ডকুমেন্টেশনে আমার অবশ্যই এটি তদারকি করা উচিত। বেশ কিছু রাত হয়েছে।
জেরিট ফ্রাইজ

4
Safe.php.net/manual/en/function.password-hash.php অনুসারে "পিএইচপি 7.০.০ হিসাবে লবণের বিকল্পটি হ্রাস করা হয়েছে। এখন এটি ডিফল্টরূপে উত্পন্ন লবণকে কেবলমাত্র ব্যবহার করা পছন্দ করা হয়।"
jmng
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.