দ্বি-মুখী এনক্রিপশন: আমার পুনরুদ্ধার করা যেতে পারে এমন পাসওয়ার্ড সংরক্ষণ করতে হবে


174

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

আমার যা জানা দরকার তা হ'ল:

  1. আমি কীভাবে পিএইচপি-তে একটি পাসওয়ার্ড এনক্রিপ্ট এবং ডিক্রিপ্ট করব?

  2. পাসওয়ার্ডগুলি এনক্রিপ্ট করার জন্য সবচেয়ে নিরাপদ অ্যালগরিদম কী?

  3. আমি ব্যক্তিগত কীটি কোথায় সঞ্চয় করব?

  4. প্রাইভেট কীটি সংরক্ষণ করার পরিবর্তে, ব্যবহারকারীদের যে কোনও সময় পাসওয়ার্ড ডিক্রিপ্ট করার পরে প্রাইভেট কীটি প্রবেশ করা উচিত তা কি ভাল ধারণা? (এই অ্যাপ্লিকেশন ব্যবহারকারীদের বিশ্বাস করা যেতে পারে)

  5. কীভাবে পাসওয়ার্ড চুরি এবং ডিক্রিপ্ট করা যেতে পারে? আমার সচেতন হওয়ার দরকার কী?


1
দ্রষ্টব্য: লিবসোডিয়াম এখন> = 7.2 এর জন্য পিএইচপি কোরে সংকলিত হয়েছে। এটি এখন "যান" সমাধান হতে পারে কারণ এটি এমক্রিপ্ট থেকে পৃথক আধুনিক পদ্ধতিতে পূর্ণ, যা অবনমিত হিসাবে বিবেচিত এবং সরানো হয়েছে।
প্রদর্শক

উত্তর:


212

ব্যক্তিগতভাবে, আমি mcryptঅন্যদের পোস্টের মতো ব্যবহার করব । তবে আরও অনেক বিষয় লক্ষণীয় ...

  1. আমি কীভাবে পিএইচপি-তে একটি পাসওয়ার্ড এনক্রিপ্ট এবং ডিক্রিপ্ট করব?

    শক্তিশালী শ্রেণীর জন্য নীচে দেখুন যা আপনার জন্য সমস্ত কিছুর যত্ন নেয়:

  2. পাসওয়ার্ডগুলি এনক্রিপ্ট করার জন্য সবচেয়ে নিরাপদ অ্যালগরিদম কী?

    সবচেয়ে নিরাপদ ? এদের মধ্যেকার কেউ. আপনি যদি এনক্রিপ্ট করতে চলেছেন তবে সবচেয়ে নিরাপদ পদ্ধতিটি হ'ল তথ্য প্রকাশের দুর্বলতাগুলি (এক্সএসএস, রিমোট অন্তর্ভুক্তি ইত্যাদি) রক্ষা করা। যদি এটি বের হয়ে যায়, আক্রমণকারী অবশেষে এনক্রিপশনটি ক্র্যাক করতে পারে (কোনও এনক্রিপশন কী ছাড়াই 100% আন-রিভারসিভ হয় না - @ নুল ইউজার এক্সসেপশন উল্লেখ করে যে এটি সম্পূর্ণ সত্য নয় some কিছু এনক্রিপশন স্কিম রয়েছে যা ওয়ানটাইমপ্যাডের মতো ক্র্যাক করা অসম্ভব ) ।

  3. আমি ব্যক্তিগত কীটি কোথায় সঞ্চয় করব?

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

    $key = $userKey . $serverKey . $userSuppliedKey;

    সেখানে সুবিধাটি হ'ল যে কোনও 2 কী কী ডেটা আপোস না করে আপস করা যেতে পারে। যদি কোনও এসকিউএল ইনজেকশন আক্রমণ থাকে তবে তারা এগুলি পেতে পারে $userKeyতবে অন্যটি নাও পারে a যদি কোনও স্থানীয় সার্ভার সেখানে শোষণ করে তবে তারা পেতে পারে $userKeyএবং $serverKeyতৃতীয় নয় $userSuppliedKey। যদি তারা কোনও রেঞ্চের সাহায্যে ব্যবহারকারীকে মারধর করে তবে তারা $userSuppliedKey2 টি পেতে পারে তবে অন্য 2 টি নয় (তবে আবার যদি ব্যবহারকারীকে একটি রেঞ্চ দিয়ে মারধর করা হয় তবে আপনি যেভাবেই দেরি করে নিবেন)।

  4. প্রাইভেট কীটি সংরক্ষণ করার পরিবর্তে, ব্যবহারকারীদের যে কোনও সময় পাসওয়ার্ড ডিক্রিপ্ট করার পরে প্রাইভেট কীটি প্রবেশ করা উচিত তা কি ভাল ধারণা? (এই অ্যাপ্লিকেশন ব্যবহারকারীদের বিশ্বাস করা যেতে পারে)

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

  5. কীভাবে পাসওয়ার্ড চুরি এবং ডিক্রিপ্ট করা যেতে পারে? আমার সচেতন হওয়ার দরকার কী?

    আপনার সিস্টেমে যে কোনও ধরণের আপস করা তাদের এনক্রিপ্ট করা ডেটা দেখতে দেবে। যদি তারা কোডটি ইনজেক্ট করতে পারে বা আপনার ফাইল সিস্টেমে যেতে পারে তবে তারা ডিক্রিপ্টেড ডেটা দেখতে পারে (যেহেতু তারা যে ফাইলগুলি ডিক্রিপ্ট করে এমন ফাইলগুলি সম্পাদনা করতে পারে)। রিপ্লে বা এমআইটিএম আক্রমণে যে কোনও রূপই তাদের জড়িত কীগুলিতে সম্পূর্ণ অ্যাক্সেস দেবে। কাঁচা এইচটিটিপি ট্র্যাফিক স্নিগ্ধ করা তাদের কীগুলিও দেবে।

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

সম্পাদনা করুন: এখানে একটি শক্তিশালী এনক্রিপশন পদ্ধতির একটি পিএইচপি শ্রেণীর প্রয়োগ রয়েছে:

/**
 * A class to handle secure encryption and decryption of arbitrary data
 *
 * Note that this is not just straight encryption.  It also has a few other
 *  features in it to make the encrypted data far more secure.  Note that any
 *  other implementations used to decrypt data will have to do the same exact
 *  operations.  
 *
 * Security Benefits:
 *
 * - Uses Key stretching
 * - Hides the Initialization Vector
 * - Does HMAC verification of source data
 *
 */
class Encryption {

    /**
     * @var string $cipher The mcrypt cipher to use for this instance
     */
    protected $cipher = '';

    /**
     * @var int $mode The mcrypt cipher mode to use
     */
    protected $mode = '';

    /**
     * @var int $rounds The number of rounds to feed into PBKDF2 for key generation
     */
    protected $rounds = 100;

    /**
     * Constructor!
     *
     * @param string $cipher The MCRYPT_* cypher to use for this instance
     * @param int    $mode   The MCRYPT_MODE_* mode to use for this instance
     * @param int    $rounds The number of PBKDF2 rounds to do on the key
     */
    public function __construct($cipher, $mode, $rounds = 100) {
        $this->cipher = $cipher;
        $this->mode = $mode;
        $this->rounds = (int) $rounds;
    }

    /**
     * Decrypt the data with the provided key
     *
     * @param string $data The encrypted datat to decrypt
     * @param string $key  The key to use for decryption
     * 
     * @returns string|false The returned string if decryption is successful
     *                           false if it is not
     */
    public function decrypt($data, $key) {
        $salt = substr($data, 0, 128);
        $enc = substr($data, 128, -64);
        $mac = substr($data, -64);

        list ($cipherKey, $macKey, $iv) = $this->getKeys($salt, $key);

        if (!hash_equals(hash_hmac('sha512', $enc, $macKey, true), $mac)) {
             return false;
        }

        $dec = mcrypt_decrypt($this->cipher, $cipherKey, $enc, $this->mode, $iv);

        $data = $this->unpad($dec);

        return $data;
    }

    /**
     * Encrypt the supplied data using the supplied key
     * 
     * @param string $data The data to encrypt
     * @param string $key  The key to encrypt with
     *
     * @returns string The encrypted data
     */
    public function encrypt($data, $key) {
        $salt = mcrypt_create_iv(128, MCRYPT_DEV_URANDOM);
        list ($cipherKey, $macKey, $iv) = $this->getKeys($salt, $key);

        $data = $this->pad($data);

        $enc = mcrypt_encrypt($this->cipher, $cipherKey, $data, $this->mode, $iv);

        $mac = hash_hmac('sha512', $enc, $macKey, true);
        return $salt . $enc . $mac;
    }

    /**
     * Generates a set of keys given a random salt and a master key
     *
     * @param string $salt A random string to change the keys each encryption
     * @param string $key  The supplied key to encrypt with
     *
     * @returns array An array of keys (a cipher key, a mac key, and a IV)
     */
    protected function getKeys($salt, $key) {
        $ivSize = mcrypt_get_iv_size($this->cipher, $this->mode);
        $keySize = mcrypt_get_key_size($this->cipher, $this->mode);
        $length = 2 * $keySize + $ivSize;

        $key = $this->pbkdf2('sha512', $key, $salt, $this->rounds, $length);

        $cipherKey = substr($key, 0, $keySize);
        $macKey = substr($key, $keySize, $keySize);
        $iv = substr($key, 2 * $keySize);
        return array($cipherKey, $macKey, $iv);
    }

    /**
     * Stretch the key using the PBKDF2 algorithm
     *
     * @see http://en.wikipedia.org/wiki/PBKDF2
     *
     * @param string $algo   The algorithm to use
     * @param string $key    The key to stretch
     * @param string $salt   A random salt
     * @param int    $rounds The number of rounds to derive
     * @param int    $length The length of the output key
     *
     * @returns string The derived key.
     */
    protected function pbkdf2($algo, $key, $salt, $rounds, $length) {
        $size   = strlen(hash($algo, '', true));
        $len    = ceil($length / $size);
        $result = '';
        for ($i = 1; $i <= $len; $i++) {
            $tmp = hash_hmac($algo, $salt . pack('N', $i), $key, true);
            $res = $tmp;
            for ($j = 1; $j < $rounds; $j++) {
                 $tmp  = hash_hmac($algo, $tmp, $key, true);
                 $res ^= $tmp;
            }
            $result .= $res;
        }
        return substr($result, 0, $length);
    }

    protected function pad($data) {
        $length = mcrypt_get_block_size($this->cipher, $this->mode);
        $padAmount = $length - strlen($data) % $length;
        if ($padAmount == 0) {
            $padAmount = $length;
        }
        return $data . str_repeat(chr($padAmount), $padAmount);
    }

    protected function unpad($data) {
        $length = mcrypt_get_block_size($this->cipher, $this->mode);
        $last = ord($data[strlen($data) - 1]);
        if ($last > $length) return false;
        if (substr($data, -1 * $last) !== str_repeat(chr($last), $last)) {
            return false;
        }
        return substr($data, 0, -1 * $last);
    }
}

মনে রাখবেন যে, আমি একটি ফাংশন পিএইচপি 5.6 যোগ ব্যবহার করছি: hash_equals। আপনি যদি 5.6 এরও কম থাকেন তবে আপনি এই বিকল্প ফাংশনটি ব্যবহার করতে পারেন যা ডাবল এইচএমএসি যাচাইকরণ ব্যবহার করে একটি সময়-নিরাপদ তুলনা ফাংশন প্রয়োগ করে :

function hash_equals($a, $b) {
    $key = mcrypt_create_iv(128, MCRYPT_DEV_URANDOM);
    return hash_hmac('sha512', $a, $key) === hash_hmac('sha512', $b, $key);
}

ব্যবহার:

$e = new Encryption(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
$encryptedData = $e->encrypt($data, $key);

তারপরে, ডিক্রিপ্ট করতে:

$e2 = new Encryption(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
$data = $e2->decrypt($encryptedData, $key);

নোট করুন যে আমি $e2দ্বিতীয়বার আপনাকে বিভিন্ন উদাহরণ দেখানোর জন্য ব্যবহার করেছি এখনও ডেটা সঠিকভাবে ডিক্রিপ্ট করবে।

এখন, এটি কীভাবে কাজ করে / কেন এটি অন্য সমাধানের জন্য ব্যবহার করে:

  1. কী

    • কীগুলি সরাসরি ব্যবহার হয় না। পরিবর্তে, কীটি একটি স্ট্যান্ডার্ড পিবিকেডিএফ 2 ডেরাইভেশন দ্বারা প্রসারিত।

    • এনক্রিপশনের জন্য ব্যবহৃত কীটি পাঠ্যের প্রতিটি এনক্রিপ্ট হওয়া ব্লকের জন্য স্বতন্ত্র। সরবরাহিত কী তাই "মাস্টার কী" হয়ে যায়। এই শ্রেণিটি তাই সাইফার এবং প্রমাণীকরণের কীগুলির জন্য কী ঘূর্ণন সরবরাহ করে।

    • গুরুত্বপূর্ণ দ্রষ্টব্য , $roundsপ্যারামিটারটি যথাযথ শক্তির সত্য র্যান্ডম কীগুলির জন্য (কমপক্ষে 128 বিট ক্রিপ্টোগ্রাফিকলি সুরক্ষিত র্যান্ডম ন্যূনতম) জন্য কনফিগার করা হয়েছে। আপনি যদি কোনও পাসওয়ার্ড, বা নন-র্যান্ডম কী (বা কম র্যান্ডম তারপর সিএস র্যান্ডম এর 128 বিট) ব্যবহার করতে চলেছেন তবে আপনাকে অবশ্যই এই প্যারামিটারটি বাড়িয়ে তুলতে হবে । আমি পাসওয়ার্ডগুলির জন্য ন্যূনতম 10000 টি প্রস্তাব করব (যত বেশি আপনি সাধ্যের তুলনা করতে পারেন তত ভাল, তবে এটি রানটাইমের সাথে যুক্ত করবে) ...

  2. তথ্য অখণ্ডতা

    • আপডেট হওয়া সংস্করণটি এনক্রিপিটি-থেন-ম্যাক ব্যবহার করে, যা এনক্রিপ্ট করা ডেটার সত্যতা নিশ্চিত করার জন্য আরও অনেক ভাল পদ্ধতি।
  3. জোড়া লাগানো:

    • এটি এনক্রিপশনটি সম্পাদন করতে mcrypt ব্যবহার করে। আমি উভয় MCRYPT_BLOWFISHবা MCRYPT_RIJNDAEL_128সাইফার এবং MCRYPT_MODE_CBCমোডের জন্য ব্যবহার করার পরামর্শ দেব । এটি যথেষ্ট শক্তিশালী, এবং এখনও মোটামুটি দ্রুত (একটি এনক্রিপশন এবং ডিক্রিপশন চক্র আমার মেশিনে প্রায় 1/2 সেকেন্ড সময় নেয়)।

এখন, প্রথম তালিকা থেকে 3 পয়েন্ট হিসাবে, এটি আপনাকে কী দেয় তা এই জাতীয় ফাংশন:

function makeKey($userKey, $serverKey, $userSuppliedKey) {
    $key = hash_hmac('sha512', $userKey, $serverKey);
    $key = hash_hmac('sha512', $key, $userSuppliedKey);
    return $key;
}

আপনি এটি ফাংশনটিতে প্রসারিত করতে পারেন makeKey(), তবে যেহেতু এটি পরে প্রসারিত হতে চলেছে, তাই এটি করার পক্ষে সত্যিকার অর্থে একটি বিশাল পয়েন্ট নেই।

স্টোরেজ আকারের হিসাবে এটি প্লেইন পাঠ্যের উপর নির্ভর করে। ব্লোফিশ একটি 8 বাইট ব্লকের আকার ব্যবহার করে, তাই আপনার কাছে এটি থাকবে:

  • নুনের জন্য 16 বাইট
  • এইচএমএকে জন্য 64 বাইট
  • তথ্য দৈর্ঘ্য
  • প্যাডিং যাতে ডেটা দৈর্ঘ্য% 8 == 0

সুতরাং একটি 16 অক্ষরের ডেটা উত্সের জন্য, এনক্রিপ্ট করার জন্য 16 অক্ষর ডেটা থাকবে। সুতরাং এর অর্থ হল প্যাডিংয়ের কারণে প্রকৃত এনক্রিপ্ট হওয়া ডেটা আকার 16 বাইট। তারপরে লবণের জন্য 16 বাইট এবং এইচএমএকের জন্য 64 বাইট যুক্ত করুন এবং মোট সঞ্চিত আকার 96 বাইট। সুতরাং সর্বোপরি একটি 80 টি চরিত্রের ওভারহেড রয়েছে এবং সবচেয়ে খারাপ একটি 87 টি চরিত্রের ওভারহেড ...

আমি আশা করি এটি সাহায্য করবে...

দ্রষ্টব্য: 12/11/12: আমি আরও ভাল এনক্রিপশন পদ্ধতিটি দিয়ে আরও ভাল উত্পন্ন কীগুলি ব্যবহার করে এবং ম্যাক প্রজন্মের স্থিরকরণের সাথে এই ক্লাসটি আপডেট করেছি ...


3
"ব্রেক" এর অর্থ কেউ বুঝতে পারে না। ক্লাসে @ আইআরসি দুর্দান্ত কাজ, এটি দুর্দান্ত কোডড।
jcolebrand

1
নিম্নলিখিত মিথ্যা প্রত্যাবর্তন। কোন ধারণা কেন? $ x = নতুন এনক্রিপশন (MCRYPT_BlOWFISH, MCRYPT_MODE_CBC); $ পরীক্ষা = $ x-> এনক্রিপ্ট ("পরীক্ষা", "ক"); প্রতিধ্বনি var_dump ($ x-> ডিক্রিপ্ট ($ পরীক্ষা, "একটি"));
দিভন্ত দৈর্ঘ্য

2
ওহ এবং আবার ডিক্রিপ্ট ফাংশন দুই পরিবর্তন -64করতে গুলি -128করেছে (তাই আপনি পেতে $enc = substr($data, 128, -128)এবং$mac = substr($data, -128);
cosmorogers

4
@ircmaxell কোডটি সর্বশেষ সংশোধন করার পরে বেশ কিছুক্ষণ হয়েছে তাই আমি ভাবছি যে এটি আপ টু ডেট আছে। একটি আর্থিক আবেদনের জন্য আমার অনুরূপ কিছু ব্যবহার করা দরকার এবং আপনি এই শ্রেণীর সাথে
ঠিকঠাক দিলে ভাল লাগবে

2
সতর্কবাণী! এমক্রিপট এক্সটেনশনটি প্রায় এক দশক ধরে বিস্মৃত হয়েছে এবং এটি ব্যবহার করা মোটামুটি জটিল ছিল। সুতরাং এটি ওপেনএসএসএলের পক্ষে অবহিত করা হয়েছে, যেখানে এটি মূল থেকে সরিয়ে পিএইচপি PH.২-তে পিইসিএল-এ পরিণত হবে। th1.php.net/manual/en/migration71.deprecated.php
ভি

15

আমি কীভাবে পিএইচপি-তে একটি পাসওয়ার্ড এনক্রিপ্ট এবং ডিক্রিপ্ট করব? অনেকগুলি এনক্রিপশন অ্যালগরিদমের একটি প্রয়োগ করে। (বা অনেক লাইব্রেরির মধ্যে একটি ব্যবহার করে)

পাসওয়ার্ডগুলি এনক্রিপ্ট করার জন্য সবচেয়ে নিরাপদ অ্যালগরিদম কী? বিভিন্ন টাকার বিভিন্ন অ্যালগরিদম রয়েছে যার মধ্যে কোনওটিই 100% সুরক্ষিত নয়। তবে তাদের অনেকগুলি বাণিজ্য এবং এমনকি সামরিক উদ্দেশ্যে যথেষ্ট সুরক্ষিত

আমি ব্যক্তিগত কীটি কোথায় সঞ্চয় করব? যদি আপনি সর্বজনীন কী - ক্রিপ্টোগ্রাফি অ্যালগরিদম (যেমন আরএসএ) বাস্তবায়নের সিদ্ধান্ত নিয়ে থাকেন তবে আপনি ব্যক্তিগত কী সংরক্ষণ করবেন না। ব্যবহারকারীর ব্যক্তিগত কী আছে। আপনার সিস্টেমে সর্বজনীন কী রয়েছে যা আপনার ইচ্ছা যেখানেই সংরক্ষণ করা যেতে পারে।

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

কীভাবে পাসওয়ার্ড চুরি এবং ডিক্রিপ্ট করা যেতে পারে? আমার সচেতন হওয়ার দরকার কী? এটি ব্যবহৃত অ্যালগরিদমের উপর নির্ভর করে। তবে সর্বদা নিশ্চিত হয়ে নিন যে আপনি ব্যবহারকারীর কাছে বা এনক্রিপ্ট করা পাসওয়ার্ড প্রেরণ করবেন না। হয় এটিকে ক্লায়েন্টের পাশে এনক্রিপ্ট / ডিক্রিপ্ট করুন, বা https ব্যবহার করুন (বা সার্ভার এবং ক্লায়েন্টের মধ্যে সংযোগ সুরক্ষার জন্য ব্যবহারকারীদের অন্যান্য ক্রিপ্টোগ্রাফিক উপায়ে)।

তবে আপনার যদি যা যা প্রয়োজন হয় তা হ'ল এনক্রিপ্ট করা উপায়ে পাসওয়ার্ডগুলি সঞ্চয় করা, আমি আপনাকে একটি সাধারণ এক্সওআর সাইফার ব্যবহার করার পরামর্শ দিচ্ছি। এই অ্যালগরিদমের মূল সমস্যাটি হ'ল ফ্রিকোয়েন্সি বিশ্লেষণ করে সহজেই এটি ভেঙে যেতে পারে। তবে সাধারণত ইংরেজী পাঠের দীর্ঘ অনুচ্ছেদে পাসওয়ার্ড তৈরি হয় না বলে আমি মনে করি না যে এটি সম্পর্কে আপনার চিন্তা করা উচিত। এক্সওআর সাইফারের দ্বিতীয় সমস্যাটি হ'ল যদি আপনার এনক্রিপ্ট করা এবং ডিক্রিপ্ট করা উভয় ফর্মের মধ্যে একটি বার্তা থাকে তবে আপনি সহজেই এটি পাসওয়ার্ড খুঁজে পেতে পারেন যার সাথে এটি এনক্রিপ্ট করা হয়েছিল। আবার, আপনার ক্ষেত্রে কোনও বড় সমস্যা নয় কারণ এটি কেবলমাত্র সেই ব্যবহারকারীকেই প্রভাবিত করে যাকে ইতিমধ্যে অন্য উপায়ে আপোস করা হয়েছিল।


উত্তর 3 এ, যখন আপনি বলেন যে ব্যবহারকারীদের ব্যক্তিগত কী রয়েছে, আমি এর অর্থ কী তা বুঝতে পারি না। আপনি ব্যবহারকারীর দ্বারা ম্যানুয়ালি অ্যাপ্লিকেশনটিতে প্রাইভেট কীগুলি পাস করার পরামর্শ দিচ্ছেন না, তবে আর কীভাবে ব্যক্তিগত কীগুলি অ্যাপ্লিকেশনটিতে পাঠানো হবে?
হায়দার

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

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

এক্সওআর-এর প্রধান সমস্যাটি হ'ল যদি কেউ আপনার অ্যাপ্লিকেশন ডেটা চুরি করে এবং কোনও ব্যবহারকারীর পাসওয়ার্ডগুলির মধ্যে একটি জানে, তারা সেই ব্যবহারকারীর জন্য অন্য সমস্ত পাসওয়ার্ডগুলি ডিক্রিপ্ট করতে পারে।
দীর্ঘ কান

1
@ ইভান: হ্যাঁ, তবে এটি এমন একটি ক্ষেত্রে যখন আমি মনে করি ডিআইওয়াই সত্যিই খারাপ you শক্তিশালী সিফার রয়েছে যা তাদের বিদ্যমান, কেন সেগুলি ব্যবহার করবেন না?
একারমেক্সেল

13
  1. আপনি যে পিএইচপি ফাংশনটি হচ্ছেন তা হ'ল ম্যাক্রিপ্ট ( http://www.php.net/manual/en/intro.mcrypt.php )।

ম্যানুয়াল থেকে উদাহরণটি এই উদাহরণের জন্য সামান্য সম্পাদিত হয়):

<?php
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "This is a very secret key";
$pass = "PasswordHere";
echo strlen($pass) . "\n";

$crypttext = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $pass, MCRYPT_MODE_ECB, $iv);
echo strlen($crypttext) . "\n";
?>

আপনি আপনার পাসওয়ার্ড ডিক্রিপ্ট করতে mcrypt_decrypt ব্যবহার করবেন।

  1. সেরা অ্যালগরিদম বরং বিষয়গত - 5 জনকে জিজ্ঞাসা করুন, 5 টি উত্তর পান। ব্যক্তিগতভাবে যদি ডিফল্ট (ব্লোফিশ) আপনার পক্ষে যথেষ্ট ভাল না হয় তবে আপনার সম্ভবত বড় সমস্যা রয়েছে!

  2. এটি এনক্রিপ্ট করার জন্য পিএইচপি দরকার - এটি আপনি যে কোনও জায়গায় লুকিয়ে রাখতে পারবেন তা নিশ্চিত নয় - এটি সম্পর্কে মন্তব্য স্বাগত। স্ট্যান্ডার্ড পিএইচপি সেরা কোডিং অনুশীলন অবশ্যই প্রয়োগ!

  3. প্রদত্ত যে এনক্রিপশন কীটি যাইহোক আপনার কোডে থাকবে, আপনি কী লাভ করবেন তা নিশ্চিত নন, আপনার বাকি অ্যাপ্লিকেশনটি সুরক্ষিত থাকবে।

  4. স্পষ্টতই, যদি এনক্রিপ্ট করা পাসওয়ার্ড এবং এনক্রিপশন কীটি চুরি হয়ে যায়, তবে খেলা শেষ।

আমি আমার উত্তরে একটি রাইডার রেখেছি - আমি পিএইচপি ক্রিপ্টো বিশেষজ্ঞ নই, তবে, আমি যা উত্তর দিয়েছি তা স্ট্যান্ডার্ড অনুশীলন - আমি অন্যান্য মন্তব্যগুলির আমি স্বাগত জানাই।


$pass = $text। আমি মনে করি তিনি প্রশ্নটি পূরণের জন্য এটি পরিবর্তন করেছিলেন এবং দ্বিতীয় ঘটনাটি লক্ষ্য করেননি।
হায়দার

3
দুটি বিষয় লক্ষণীয়। প্রথমত, MCRYPT_MODE_ECBIV ব্যবহার করে না। দ্বিতীয়ত, এটি যদি হয়, আপনার
আইভিটি

"সেরা অ্যালগরিদম বরং বিষয়ভিত্তিক - 5 জনকে জিজ্ঞাসা করুন, 5 টি উত্তর পান। ব্যক্তিগতভাবে যদি ডিফল্ট (ব্লোফিশ) আপনার পক্ষে যথেষ্ট ভাল না হয় তবে আপনার সম্ভবত আরও বড় সমস্যা আছে!" এটা সম্পূর্ণ ভুল। যে কোনও ক্রিপ্টো বিশেষজ্ঞ gist.github.com/tqbf/be58d2d39690c3b366 এডিতে বিশেষত ব্লোফিশকে বাদ দিয়ে আরও কম-বেশি সম্মত হবেন
স্কট আর্কিসজেউস্কি

6

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

আপনি mcrypt ব্যবহার করে সাফল্যের সাথে এনক্রিপ্ট করার পরে, এটি বেস 64_encode এর মাধ্যমে চালান এবং তারপরে এটিকে হেক্স কোডে রূপান্তর করুন convert একবার হেক্স কোডে বিভিন্ন উপায়ে স্থানান্তর করা সহজ।

$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$key = substr("SUPERSECRETKEY",0,mcrypt_enc_get_key_size($td));
mcrypt_generic_init($td, $key, $iv);
$encrypted = mcrypt_generic($td, $unencrypted);
$encrypted = $ua."||||".$iv;
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$encrypted = base64_encode($encrypted);
$encrypted = array_shift(unpack('H*', $encrypted));

এবং অন্যদিকে:

$encrypted = pack('H*', $encrypted);
$encrypted = base64_decode($encrypted);
list($encrypted,$iv) = explode("||||",$encrypted,2);
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$key = substr("SUPERSECRETKEY",0,mcrypt_enc_get_key_size($td));
mcrypt_generic_init($td, $key, $iv);
$unencrypted = mdecrypt_generic($td, $encrypted);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);


2
ভাল - এটি ২০১১ সালে ছিল: পি
ব্র্যাডলি

5

আমি কেবলমাত্র পাবলিক কী এনক্রিপশনের পরামর্শ দিই যদি আপনি তাদের মিথস্ক্রিয়া ছাড়াই কোনও ব্যবহারকারীর পাসওয়ার্ড সেট করার দক্ষতা চান (এটি পুনরায় সেট এবং ভাগ করা পাসওয়ার্ডগুলির পক্ষে কার্যকর হতে পারে)।

পাবলিক কী

  1. দ্বারা OpenSSL এক্সটেনশন, বিশেষভাবে openssl_public_encryptএবংopenssl_private_decrypt
  2. এটি আপনার পাসওয়ার্ডগুলি মূল আকারের - প্যাডিংয়ের সাথে খাপ খায় এমনটি ধরে নেওয়া সোজা আরএসএ হবে, অন্যথায় আপনার একটি প্রতিসম স্তর প্রয়োজন
  3. প্রতিটি ব্যবহারকারীর জন্য উভয় কী সংরক্ষণ করুন, ব্যক্তিগত কীগুলির পাসফ্রেজ হ'ল তাদের অ্যাপ্লিকেশন পাসওয়ার্ড

ভারসাম্য-সংক্রান্ত

  1. Mcrypt এক্সটেনশন
  2. AES-256 সম্ভবত একটি নিরাপদ বাজি, তবে এটি নিজেই একটি প্রশ্ন হতে পারে
  3. আপনি করবেন না - এটি তাদের অ্যাপ্লিকেশন পাসওয়ার্ড হবে

উভয়

4। হ্যাঁ - ব্যবহারকারীদের প্রতিবার তাদের অ্যাপ্লিকেশন পাসওয়ার্ড প্রবেশ করতে হবে, তবে এটি সেশনে এটি সংরক্ষণ করা অন্যান্য সমস্যা উত্থাপন করবে

5

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

এমক্রিপ্ট এড়িয়ে চলুন, সাবধানতা অবলম্বন করুন openssl_private_decrypt()
স্কট আর্কিসজেউস্কি

2

আমি এরকম কিছু চেষ্টা করেছি তবে দয়া করে মনে রাখবেন যে আমি ক্রিপ্টোগ্রাফার নই বা আমি phpকোনও প্রোগ্রামিং ভাষা বা তার সম্পর্কে গভীর জ্ঞান রাখি না । এটা শুধু একটি ধারণা। আমার ধারণাটি এমন keyকোনও ফাইলে সংরক্ষণ করা বা database(বা ম্যানুয়ালি প্রবেশ করা) যা (অবস্থান) সহজেই অনুমান করা যায় না (এবং অবশ্যই কোনও দিন ডিক্রিপ্ট করা হবে, ধারণাটি হ'ল ডিক্রিপশন সময় দীর্ঘ করতে হবে) এবং সংবেদনশীল তথ্য এনক্রিপ্ট করা হবে।

$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH , MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "evenifyouaccessmydatabaseyouwillneverfindmyemail";
$text = "myemail@domain.com";
echo "Key : ".$key."<br/>";
echo "Text : ".$text . "<br/>";
echo "Md5 : ".md5($text). "<br/>";
echo "Sha1 : ".sha1($text). "<br/>";



$crypttext = mcrypt_encrypt(MCRYPT_BLOWFISH , $key, $text, MCRYPT_MODE_ECB, $iv);
echo "Crypted Data : ".$crypttext."<br>";

$base64 = base64_encode($crypttext);
echo "Encoded Data : ".$base64."<br/>";
$decode =  base64_decode($base64);


$decryptdata = mcrypt_decrypt(MCRYPT_BLOWFISH , $key, $crypttext, MCRYPT_MODE_ECB, $iv);

echo "Decoded Data : ".ereg_replace("?", null ,  $decryptdata); 
//event if i add '?' to the sting to the text it works, I don't know why.

দয়া করে মনে রাখবেন এটি কেবল একটি ধারণা। এই কোডে কোনও উন্নতি অত্যন্ত প্রশংসনীয় হবে।


2

পাসওয়ার্ডগুলি একটি হার্ডওয়্যার ডিভাইসের জন্য, সুতরাং হ্যাশগুলির বিরুদ্ধে চেক করা প্রশ্নটির বাইরে

অঁ্যা? আমি বুঝতে পারছি না। আপনি কি শুধু বোঝাতে চাইছেন যে পাসওয়ার্ডটি পুনরুদ্ধারযোগ্য হতে হবে?

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

বেশিরভাগ সুরক্ষা দুর্বলতাগুলি অন্তর্নিহিত অ্যালগরিদম ত্রুটিযুক্ত বা অনিরাপদ কারণেই আসে না - তবে অ্যাপ্লিকেশন কোডের মধ্যে যেভাবে অ্যালগোরিদম ব্যবহৃত হয় তাতে সমস্যা রয়েছে।

এটি বলার পরে, যুক্তিসঙ্গতভাবে নিরাপদ ব্যবস্থা তৈরি করা সম্ভব

আপনার যদি কেবলমাত্র কোনও সুরক্ষিত বার্তা তৈরির কোনও ব্যবহারকারীর জন্য অন্য (নির্দিষ্ট) ব্যবহারকারীর দ্বারা পঠনযোগ্য হয় তবে আপনার যদি অসমমিতিক এনক্রিপশন বিবেচনা করা উচিত। কারণ হ'ল এটি গণনা ব্যয়বহুল। আপনি যদি ব্যবহারকারীদের নিজস্ব ডেটা প্রবেশ করতে এবং পুনরুদ্ধার করতে কেবল একটি সংগ্রহস্থল সরবরাহ করতে চান তবে প্রতিসম এনক্রিপশন যথেষ্ট।

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


1

ব্যবহারের password_hash এবং password_verify

<?php
/**
 * In this case, we want to increase the default cost for BCRYPT to 12.
 * Note that we also switched to BCRYPT, which will always be 60 characters.
 */
$options = [
    'cost' => 12,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>

এবং ডিক্রিপ্ট করতে:

<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.