আপনি কীভাবে পিএইচপি স্ট্রিং এনক্রিপ্ট করবেন এবং ডিক্রিপ্ট করবেন?


225

আমি যা বলতে চাই তা হল:

Original String + Salt or Key --> Encrypted String
Encrypted String + Salt or Key --> Decrypted (Original String)

হতে পারে এরকম কিছু:

"hello world!" + "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
  • পিএইচপি-তে আপনি কীভাবে এটি করতে পারেন?

ব্যবহারের চেষ্টা করা হয়েছিল Crypt_Blowfish, কিন্তু এটি আমার পক্ষে কার্যকর হয়নি।


35
@ রোগ তিনি একটি হ্যাশ চান না, তিনি প্রতিসামগ্রী এনক্রিপশন চান (এএসএসের মতো), তিনি জানেন না কী এটি বলা হয়। (এবং এখন তিনি করেন :))
পাতাসু

এটি কতটা সুরক্ষিত হওয়া দরকার?

3
@ 夏 期 劇場, আপনি 'লবণের' প্রতিসম এনক্রিপশন করেন না, আপনি একটি কী ব্যবহার করেন। একটি কী অবশ্যই গোপন রাখতে হবে। সুরক্ষার ক্ষতি না করেই একটি লবণ সর্বজনীন হতে পারে (যতক্ষণ না প্রত্যেকের লবণ আলাদা থাকে), এবং এটি হ্যাশিং পাসওয়ার্ডগুলিতে ব্যবহৃত একটি শব্দ।
পাতাসু

2
আপনার একটি সল্ট (প্রাইভেট কী) দরকার, একটি পাবলিক কী একটি এনক্রিপশন অ্যালগরিদম যেমন AES-256: wpy.me/blog/15-encrypt-
এবং-

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

উত্তর:


410

আপনি আরও কিছু করার আগে, এনক্রিপশন এবং প্রমাণীকরণের মধ্যে পার্থক্যটি বোঝার চেষ্টা করুন এবং কেন আপনি সম্ভবত কেবল এনক্রিপশন না করে সত্যায়িত এনক্রিপশন চান ।

অনুমোদনপ্রাপ্ত এনক্রিপশন প্রয়োগ করতে, আপনি ম্যাকটি এনক্রিপ্ট করতে চান। এনক্রিপশন এবং প্রমাণীকরণের ক্রমটি খুব গুরুত্বপূর্ণ! এই প্রশ্নের বিদ্যমান উত্তরগুলির মধ্যে একটি এই ভুল করেছে; যেমন পিএইচপি-তে লেখা অনেকগুলি ক্রিপ্টোগ্রাফি গ্রন্থাগার রয়েছে।

আপনার নিজের ক্রিপ্টোগ্রাফি প্রয়োগ করা এড়ানো উচিত এবং পরিবর্তে ক্রিপ্টোগ্রাফি বিশেষজ্ঞদের দ্বারা লিখিত এবং পর্যালোচনা করা একটি সুরক্ষিত গ্রন্থাগার ব্যবহার করা উচিত ।

আপডেট: পিএইচপি 7.2 এখন লিবসডিয়াম সরবরাহ করে ! সেরা সুরক্ষার জন্য, পিএইচপি .2.২ বা উচ্চতর ব্যবহার করার জন্য আপনার সিস্টেমগুলি আপডেট করুন এবং কেবলমাত্র এই উত্তরে লিবসোডিয়াম পরামর্শ অনুসরণ করুন।

আপনার যদি পিইসিএল অ্যাক্সেস থাকে তবে লাইবসোডিয়াম ব্যবহার করুন (বা পিইসিএল ছাড়াই যদি সোডিয়াম_কম্প্যাট চান তবে লাইবসিয়াম); অন্যথায় ...
ডিফিউজ / পিএইচপি-এনক্রিপশন ব্যবহার করুন ; আপনার নিজস্ব ক্রিপ্টোগ্রাফি রোল করবেন না!

উপরের সাথে সংযুক্ত দুটি লাইব্রেরি আপনার নিজের লাইব্রেরিতে প্রমাণীকৃত এনক্রিপশন প্রয়োগ করা সহজ এবং বেদনাদায়ক করে তোলে।

আপনি যদি এখনও নিজের ক্রিপ্টোগ্রাফি গ্রন্থাগারটি লিখতে এবং স্থাপন করতে চান তবে ইন্টারনেটের প্রতিটি ক্রিপ্টোগ্রাফি বিশেষজ্ঞের প্রচলিত জ্ঞানের বিপরীতে, এই পদক্ষেপগুলি আপনাকে নিতে হবে।

জোড়া লাগানো:

  1. সিটিআর মোডে AES ব্যবহার করে এনক্রিপ্ট করুন। আপনি জিসিএম (যা পৃথক ম্যাকের প্রয়োজনীয়তা সরিয়ে দেয়) ব্যবহার করতে পারেন। অতিরিক্তভাবে, চ্যাচ20 এবং সালসা20 ( লাইবসোডিয়াম দ্বারা সরবরাহিত ) স্ট্রিম সাইফার এবং বিশেষ মোডের প্রয়োজন হয় না।
  2. আপনি উপরে জিসিএম না চয়ন না করে আপনার HMAC-SHA-256 (অথবা, স্ট্রিম সাইফারগুলির জন্য, Poly1305 - বেশিরভাগ লিবসোডিয়াম এপিআই আপনার জন্য এটি করে) দিয়ে সিফারেক্সটটি অনুমোদন করা উচিত। ম্যাকের আইভির পাশাপাশি সিফারটেক্সটটিও কভার করা উচিত!

ডিক্রিপশন:

  1. Poly1305 বা GCM ব্যবহার না করা অবধি সাইফারটেক্সটের ম্যাককে পুনরায় গণনা করুন এবং যে ম্যাক ব্যবহার করে প্রেরণ করা হয়েছিল তা এটির সাথে তুলনা করুন hash_equals()। যদি এটি ব্যর্থ হয় তবে গর্ভপাত বন্ধ করুন।
  2. বার্তাটি ডিক্রিপ্ট করুন।

অন্যান্য নকশা বিবেচনা:

  1. কখনও কিছু সংকুচিত করবেন না। সিফেরেক্সটেক্স কমপ্রেসযোগ্য নয়; এনক্রিপশন করার আগে প্লেটেক্সট সংক্ষেপে তথ্য ফাঁস হতে পারে (যেমন সিআরআইএম এবং টিএলএসে পাঠান)।
  2. সমস্যাগুলি রোধ করতে আপনি অক্ষর সেট মোড ব্যবহার করেছেন mb_strlen()এবং তা নিশ্চিত করুন ।mb_substr()'8bit'mbstring.func_overload
  3. আইভিগুলি একটি সিএসপিআরএনজি ব্যবহার করে উত্পন্ন করা উচিত ; আপনি ব্যবহার করেন, তাহলে mcrypt_create_iv(), ব্যবহার করবেন নাMCRYPT_RAND !
  4. আপনি যদি কোনও এএইডি কনস্ট্রাক্ট না ব্যবহার করেন তবে সর্বদা ম্যাকটি এনক্রিপ্ট করুন!
  5. bin2hex(), base64_encode()ইত্যাদি ইত্যাদি ক্যাশে টাইমিংয়ের মাধ্যমে আপনার এনক্রিপশন কীগুলির তথ্য ফাঁস করতে পারে। সম্ভব হলে এড়িয়ে চলুন।

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

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

গুরুত্বপূর্ণ: কখন এনক্রিপশন ব্যবহার করবেন না

পাসওয়ার্ডগুলি এনক্রিপ্ট করবেন না । পরিবর্তেআপনিএইগুলি পাসওয়ার্ড-হ্যাশিং অ্যালগরিদম ব্যবহার করে হ্যাশ করতেচান:

পাসওয়ার্ড স্টোরেজ করার জন্য কখনই সাধারণ-উদ্দেশ্যে হ্যাশ ফাংশন (MD5, SHA256) ব্যবহার করবেন না।

ইউআরএল প্যারামিটারগুলি এনক্রিপ্ট করবেন নাএটি কাজের জন্য ভুল সরঞ্জাম।

পিএইচপি স্ট্রিং এনক্রিপশন উদাহরণ Libsium সঙ্গে

আপনি যদি পিএইচপি <7.2 তে থাকেন বা অন্যথায় লিবসডিয়াম ইনস্টল না করে থাকেন তবে একই ফলাফল অর্জন করতে আপনি সোডিয়াম_কম্প্যাট ব্যবহার করতে পারেন (ধীর হলেও)।

<?php
declare(strict_types=1);

/**
 * Encrypt a message
 * 
 * @param string $message - message to encrypt
 * @param string $key - encryption key
 * @return string
 * @throws RangeException
 */
function safeEncrypt(string $message, string $key): string
{
    if (mb_strlen($key, '8bit') !== SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
        throw new RangeException('Key is not the correct size (must be 32 bytes).');
    }
    $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

    $cipher = base64_encode(
        $nonce.
        sodium_crypto_secretbox(
            $message,
            $nonce,
            $key
        )
    );
    sodium_memzero($message);
    sodium_memzero($key);
    return $cipher;
}

/**
 * Decrypt a message
 * 
 * @param string $encrypted - message encrypted with safeEncrypt()
 * @param string $key - encryption key
 * @return string
 * @throws Exception
 */
function safeDecrypt(string $encrypted, string $key): string
{   
    $decoded = base64_decode($encrypted);
    $nonce = mb_substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
    $ciphertext = mb_substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');

    $plain = sodium_crypto_secretbox_open(
        $ciphertext,
        $nonce,
        $key
    );
    if (!is_string($plain)) {
        throw new Exception('Invalid MAC');
    }
    sodium_memzero($ciphertext);
    sodium_memzero($key);
    return $plain;
}

তারপরে এটি পরীক্ষা করার জন্য:

<?php
// This refers to the previous code block.
require "safeCrypto.php"; 

// Do this once then store it somehow:
$key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);
$message = 'We are all living in a yellow submarine';

$ciphertext = safeEncrypt($message, $key);
$plaintext = safeDecrypt($ciphertext, $key);

var_dump($ciphertext);
var_dump($plaintext);

হ্যালাইট - লিবসোডিয়াম সহজতর তৈরি

প্রকল্প আমি কাজ করছি এক নামক একটি এনক্রিপশন লাইব্রেরী halite , যা লক্ষ্য libsodium সহজ এবং আরও বেশি ধারণাসম্পন্ন করা।

<?php
use \ParagonIE\Halite\KeyFactory;
use \ParagonIE\Halite\Symmetric\Crypto as SymmetricCrypto;

// Generate a new random symmetric-key encryption key. You're going to want to store this:
$key = new KeyFactory::generateEncryptionKey();
// To save your encryption key:
KeyFactory::save($key, '/path/to/secret.key');
// To load it again:
$loadedkey = KeyFactory::loadEncryptionKey('/path/to/secret.key');

$message = 'We are all living in a yellow submarine';
$ciphertext = SymmetricCrypto::encrypt($message, $key);
$plaintext = SymmetricCrypto::decrypt($ciphertext, $key);

var_dump($ciphertext);
var_dump($plaintext);

অন্তর্নিহিত সমস্ত ক্রিপ্টোগ্রাফি সমস্তই লিবসডিয়াম দ্বারা পরিচালিত হয়।

অপসারণ / পিএইচপি-এনক্রিপশন সহ উদাহরণ

<?php
/**
 * This requires https://github.com/defuse/php-encryption
 * php composer.phar require defuse/php-encryption
 */

use Defuse\Crypto\Crypto;
use Defuse\Crypto\Key;

require "vendor/autoload.php";

// Do this once then store it somehow:
$key = Key::createNewRandomKey();

$message = 'We are all living in a yellow submarine';

$ciphertext = Crypto::encrypt($message, $key);
$plaintext = Crypto::decrypt($ciphertext, $key);

var_dump($ciphertext);
var_dump($plaintext);

দ্রষ্টব্য : Crypto::encrypt()হেক্স-এনকোডড আউটপুট প্রদান করে।

এনক্রিপশন কী পরিচালনা

যদি আপনি "পাসওয়ার্ড" ব্যবহার করতে প্ররোচিত হন, এখনই থামুন। আপনার একটি এলোমেলো 128-বিট এনক্রিপশন কী প্রয়োজন, কোনও মানব স্মরণীয় পাসওয়ার্ড নয়।

আপনি এর মতো দীর্ঘমেয়াদী ব্যবহারের জন্য একটি এনক্রিপশন কী সঞ্চয় করতে পারেন:

$storeMe = bin2hex($key);

এবং, চাহিদা অনুসারে, আপনি এটি এর মতো পুনরুদ্ধার করতে পারেন:

$key = hex2bin($storeMe);

আমি দৃ strongly়ভাবে পরামর্শ দিচ্ছি যে কী হিসাবে কোনও ধরণের পাসওয়ার্ডের পরিবর্তে দীর্ঘমেয়াদী ব্যবহারের জন্য এলোমেলোভাবে উত্পন্ন কীটি (বা কীটি উত্পন্ন করতে) সংরক্ষণ করতে হবে।

যদি আপনি ডিফিউজের লাইব্রেরি ব্যবহার করেন:

"তবে আমি সত্যিই একটি পাসওয়ার্ড ব্যবহার করতে চাই" "

এটি একটি খারাপ ধারণা, তবে ঠিক আছে, নিরাপদে এটি কীভাবে করবেন তা এখানে।

প্রথমে একটি এলোমেলো কী তৈরি করুন এবং এটিকে একটি ধ্রুবক হিসাবে সংরক্ষণ করুন।

/**
 * Replace this with your own salt! 
 * Use bin2hex() then add \x before every 2 hex characters, like so:
 */
define('MY_PBKDF2_SALT', "\x2d\xb7\x68\x1a\x28\x15\xbe\x06\x33\xa0\x7e\x0e\x8f\x79\xd5\xdf");

নোট করুন যে আপনি অতিরিক্ত কাজ যোগ করছেন এবং কেবল এই ধ্রুবকটিকে কী হিসাবে ব্যবহার করতে পারেন এবং নিজেকে প্রচুর হার্ট ব্যথা বাঁচাতে পারেন!

তারপরে সরাসরি আপনার পাসওয়ার্ড দিয়ে এনক্রিপ্ট না করে আপনার পাসওয়ার্ড থেকে একটি উপযুক্ত এনক্রিপশন কী প্রাপ্ত করার জন্য PBKDF2 (এর মতো) ব্যবহার করুন।

/**
 * Get an AES key from a static password and a secret salt
 * 
 * @param string $password Your weak password here
 * @param int $keysize Number of bytes in encryption key
 */
function getKeyFromPassword($password, $keysize = 16)
{
    return hash_pbkdf2(
        'sha256',
        $password,
        MY_PBKDF2_SALT,
        100000, // Number of iterations
        $keysize,
        true
    );
}

কেবল একটি 16-অক্ষরের পাসওয়ার্ড ব্যবহার করবেন না। আপনার এনক্রিপশন কীটি হাস্যকরভাবে ভেঙে যাবে।


3
পাসওয়ার্ডগুলি এনক্রিপ্ট করবেন না , তাদের সাথে হ্যাশ করুন password_hash()এবং তাদের সাথে চেক করুন password_verify()
স্কট আর্কিসজেউস্কি

2
"কখনও কোনও কিছু সংকুচিত করবেন না।" আপনার অর্থ এইচটিটিপি, স্পডি এবং অন্যান্য প্রোটোকলের মতো? টিএলএসের আগে? নিখুঁত পরামর্শ অনেক?
টিবেরিউ-আয়নু স্টান

1
@ স্কটআরকিসজেউউস্কি কী সম্পর্কে আপনার মন্তব্যটি আমার পছন্দ হয়েছে "// এটি একবার করুন তবে এটি কোনওভাবে সংরক্ষণ করুন:" .. কোনওভাবে, লোল :)) কীভাবে এই 'কী' (যা বস্তুটি) সরল স্ট্রিং, হার্ডকডযুক্ত হিসাবে সংরক্ষণ করা যায়? স্ট্রিং হিসাবে আমার নিজেই চাবিটি দরকার। আমি কি কোনওভাবে এই বস্তুটি থেকে এটি পেতে পারি? ধন্যবাদ
অ্যান্ড্রু

2
থেক্স, আপনার সোডিয়াম উদাহরণগুলি কাজ করার জন্য আমার কেবল একটি লাইন পরিবর্তন করতে হয়েছিল:function getKeyFromPassword($password, $keysize = \Sodium\CRYPTO_SECRETBOX_KEYBYTES)
আলেক্সি ওজারভ

1
কি দারুন! ইউআরএল প্যারামিটারগুলি এনক্রিপ্ট না করার জন্য উল্লেখ করার জন্য +1। আপনার দেওয়া নিবন্ধটি আমি সত্যিই পছন্দ করেছি: paragonie.com/blog/2015/09/…
লিনেল এমানুয়েল নেরি

72

আমি পার্টিতে দেরি করেছি, তবে এটি করার সঠিক উপায়টি অনুসন্ধান করে আমি এই পৃষ্ঠাটি জুড়ে এসেছি এটি গুগল অনুসন্ধানের শীর্ষস্থানীয় শীর্ষস্থানগুলির মধ্যে একটি ছিল, সুতরাং আমি সমস্যার বিষয়ে আমার দৃষ্টিভঙ্গিটি ভাগ করতে চাই, যা আমি এটিকে বিবেচনা করি এই পোস্টটি লেখার সময় (2017 সালের শুরু) আপ টু ডেট। পিএইচপি .1.১.০ থেকে mcrypt_decryptএবং অবমূল্যায়ন mcrypt_encryptহতে চলেছে, তাই ভবিষ্যতের প্রুফ কোড তৈরি করতে ওপেনএসএল_ইনক্রিপ্ট এবং ওপেনএসএসএল_ক্রিপ্ট ব্যবহার করা উচিত

আপনি যেমন কিছু করতে পারেন:

$string_to_encrypt="Test";
$password="password";
$encrypted_string=openssl_encrypt($string_to_encrypt,"AES-128-ECB",$password);
$decrypted_string=openssl_decrypt($encrypted_string,"AES-128-ECB",$password);

গুরুত্বপূর্ণ : এটি ইসিবি মোড ব্যবহার করে , যা নিরাপদ নয়। আপনি যদি ক্রিপ্টোগ্রাফি ইঞ্জিনিয়ারিংয়ের ক্র্যাশ কোর্স না নিয়ে একটি সহজ সমাধান চান, তবে এটি নিজে লিখবেন না, কেবল একটি লাইব্রেরি ব্যবহার করুন।

আপনার সুরক্ষা প্রয়োজনের উপর নির্ভর করে আপনি অন্য যে কোনও চিপার পদ্ধতিও ব্যবহার করতে পারেন। উপলভ্য চিপার পদ্ধতিগুলি জানতে ওপেনসেল_জেট_সিফার_মোথডসগুলি দেখুন ।


10
আপনাকে ধন্যবাদ, আমি আশ্চর্য হয়েছি এই সহজ এবং স্পষ্ট উত্তরটি বেশি প্রচারিত নয়। আমি বরং সমস্ত উত্তরের মতো 10 পৃষ্ঠাগুলির আলোচনাটি পড়তে পারব না যখন আমি চাই সমস্ত সরল স্ট্রিং এনক্রিপ্ট / ডিক্রিপ্ট হয়।
লরেন্ট

4
এটি কোনও নিরাপদ উত্তর নয়। ইসিবি মোড ব্যবহার করা উচিত নয়। আপনি যদি একটি "সহজ এবং পরিষ্কার উত্তর" চান তবে কেবল একটি লাইব্রেরি ব্যবহার করুন
স্কট আর্কিসজেউসকি

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

এটি পড়ুন এবং পুনর্বিবেচনা করুন । সিবিসি মোডের সাহায্যে একজন আক্রমণকারী সম্পূর্ণরূপে বার্তাকে পরিবর্তন করতে পারে। যদি বার্তাটি কোনও ফাইল হয় তবে কোনও আক্রমণকারী বিট এবং পপ ক্যালক.এক্সপি ফ্লিপ করতে পারে। অযৌক্তিক এনক্রিপশনের ঝুঁকি গুরুতর।
স্কট আর্কিসজেউস্কি

7
এটি সব নির্ভর করে ব্যবহারের ক্ষেত্রে! কিছু ক্ষেত্রে আছে যখন এটি নিখুঁতভাবে সূক্ষ্ম হয়। উদাহরণস্বরূপ, আমি পেজ থেকে পৃষ্ঠায় একটি জিইটি প্যারামিটারটি পাস করতে চাই, আসুন আমরা বলি prod_id=123তবে আমি কেবল সবার জন্য 123 পাঠযোগ্যযোগ্য করতে চাই না, তবে তারা এটি পড়তে পারলেও সমস্যা হবে না। কোনও আক্রমণকারী 123 কে কাস্টম মান হিসাবে প্রতিস্থাপন করতে সক্ষম হওয়ায় কোনও ক্ষতি হবে না, সে কেবলমাত্র অন্য কোনও পণ্যের বিবরণ পেতে সক্ষম হবে, তবে জো অ্যাভারেজ ব্যবহারকারী কীভাবে বিশদটি পাবেন তা সম্পর্কে কোনও ধারণা নেই উদাহরণস্বরূপ পণ্য 124। এর মতো দৃশ্যের জন্য এটি একটি নিখুঁত সমাধান, সুরক্ষার জন্য এটি কোনও অচল!
এমিল বোরকোনি

43

কী করবেন না

সতর্কতা:
এই উত্তরটি ইসিবি ব্যবহার করে । ইসিবি কোনও এনক্রিপশন মোড নয়, এটি কেবল একটি বিল্ডিং ব্লক। এই উত্তরে প্রদর্শিত হিসাবে ইসিবি ব্যবহার করা আসলে স্ট্রিংটিকে নিরাপদে এনক্রিপ্ট করে না। আপনার কোডে ইসিবি ব্যবহার করবেন না। একটি ভাল সমাধানের জন্য স্কটের উত্তর দেখুন ।

আমি নিজেই পেয়েছি আসলে আমি গুগলে কিছু উত্তর পেয়েছি এবং সবেমাত্র কিছু পরিবর্তন করেছি। ফলাফল তবে সম্পূর্ণ নিরাপদ।

<?php
define("ENCRYPTION_KEY", "!@#$%^&*");
$string = "This is the original data string!";

echo $encrypted = encrypt($string, ENCRYPTION_KEY);
echo "<br />";
echo $decrypted = decrypt($encrypted, ENCRYPTION_KEY);

/**
 * Returns an encrypted & utf8-encoded
 */
function encrypt($pure_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
    return $encrypted_string;
}

/**
 * Returns decrypted original string
 */
function decrypt($encrypted_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv);
    return $decrypted_string;
}
?>

8
আপনি আরও সুরক্ষা নিশ্চিত করতে "MCRYPT_MODE_CBC" এর পরিবর্তে "MCRYPT_MODE_CBC" ব্যবহারকারী করতে পারেন।
পরীক্ষিত

10
রমেশ, এর কারণ আপনি কাঁচা এনক্রিপ্ট করা ডেটা পেয়ে যাচ্ছেন। আপনি বেস 64 ব্যবহার করে এনক্রিপ্ট করা ডেটার একটি সুন্দর সংস্করণ পেতে পারেন: base64_encode(encrypt($string))- এটি ডিক্রিপ্ট করতে:decrypt(base64_decode($encrypted))
mendezcode

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

3
আমি ইতিমধ্যে mcrypt_encryptপ্রতিস্থাপনের নমুনা কোডটি রেখে ইতিমধ্যে এটি করেছি : php.net/manual/en/function.mcrypt-encrypt.php । নোট করুন যে এটি এখন পর্যালোচনা করে এটির শেষে সম্ভবত একটি rtrimচরিত্র "\0"থাকা উচিত ।
মার্টেন বোদেউয়েস

4
সঠিক উত্তরটি হ'ল নিজের এমক্রিপ্ট কোড লেখার পরিবর্তে ডিফিউজ / পিএইচপি-এনক্রিপশন জাতীয় কিছু ব্যবহার করা ।
স্কট আর্কিসজেউসকি

18

লারাভেল কাঠামোর জন্য

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

$string = 'Some text to be encrypted';
$encrypted = \Illuminate\Support\Facades\Crypt::encrypt($string);
$decrypted_string = \Illuminate\Support\Facades\Crypt::decrypt($encrypted);

var_dump($string);
var_dump($encrypted);
var_dump($decrypted_string);

দ্রষ্টব্য: কনফিগারেশন / অ্যাপ.পিএইচপি ফাইলের কী বিকল্পটিতে একটি 16, 24, বা 32 অক্ষরের র্যান্ডম স্ট্রিং সেট করতে ভুলবেন না। অন্যথায়, এনক্রিপ্ট করা মানগুলি নিরাপদ হবে না।


1
অবশ্যই, এটি ব্যবহার করা সহজ হতে পারে। তবে এটি কি সুরক্ষিত? এটি কীভাবে সমস্যাগুলি সমাধান করে স্ট্যাকওভারফ্লো . com/a/30159120/781723 ? এটি প্রমাণীকরণযুক্ত এনক্রিপশন ব্যবহার করে? এটি কী চ্যানেল দুর্বলতাগুলি এড়ায় এবং ধ্রুবক সময় সমতা পরীক্ষা করে তা নিশ্চিত করে? এটি কি কোনও পাসওয়ার্ড / পাসফ্রেজের পরিবর্তে সত্যিকারের এলোমেলো কী ব্যবহার করে? এটি কি কার্যকর অপারেশন মোড ব্যবহার করে? এটি কি এলোমেলোভাবে চতুর্থ সঠিকভাবে উত্পন্ন করে?
ডিডাব্লু

10

আপডেট করা হয়েছে

পিএইচপি 7 প্রস্তুত সংস্করণ। এটি পিএইচপি ওপেনএসএসএল লাইব্রেরি থেকে ওপেনএসএল_ইনক্রিপ্ট ফাংশন ব্যবহার করে ।

class Openssl_EncryptDecrypt {
    function encrypt ($pure_string, $encryption_key) {
        $cipher     = 'AES-256-CBC';
        $options    = OPENSSL_RAW_DATA;
        $hash_algo  = 'sha256';
        $sha2len    = 32;
        $ivlen = openssl_cipher_iv_length($cipher);
        $iv = openssl_random_pseudo_bytes($ivlen);
        $ciphertext_raw = openssl_encrypt($pure_string, $cipher, $encryption_key, $options, $iv);
        $hmac = hash_hmac($hash_algo, $ciphertext_raw, $encryption_key, true);
        return $iv.$hmac.$ciphertext_raw;
    }
    function decrypt ($encrypted_string, $encryption_key) {
        $cipher     = 'AES-256-CBC';
        $options    = OPENSSL_RAW_DATA;
        $hash_algo  = 'sha256';
        $sha2len    = 32;
        $ivlen = openssl_cipher_iv_length($cipher);
        $iv = substr($encrypted_string, 0, $ivlen);
        $hmac = substr($encrypted_string, $ivlen, $sha2len);
        $ciphertext_raw = substr($encrypted_string, $ivlen+$sha2len);
        $original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $encryption_key, $options, $iv);
        $calcmac = hash_hmac($hash_algo, $ciphertext_raw, $encryption_key, true);
        if(function_exists('hash_equals')) {
            if (hash_equals($hmac, $calcmac)) return $original_plaintext;
        } else {
            if ($this->hash_equals_custom($hmac, $calcmac)) return $original_plaintext;
        }
    }
    /**
     * (Optional)
     * hash_equals() function polyfilling.
     * PHP 5.6+ timing attack safe comparison
     */
    function hash_equals_custom($knownString, $userString) {
        if (function_exists('mb_strlen')) {
            $kLen = mb_strlen($knownString, '8bit');
            $uLen = mb_strlen($userString, '8bit');
        } else {
            $kLen = strlen($knownString);
            $uLen = strlen($userString);
        }
        if ($kLen !== $uLen) {
            return false;
        }
        $result = 0;
        for ($i = 0; $i < $kLen; $i++) {
            $result |= (ord($knownString[$i]) ^ ord($userString[$i]));
        }
        return 0 === $result;
    }
}

define('ENCRYPTION_KEY', '__^%&Q@$&*!@#$%^&*^__');
$string = "This is the original string!";

$OpensslEncryption = new Openssl_EncryptDecrypt;
$encrypted = $OpensslEncryption->encrypt($string, ENCRYPTION_KEY);
$decrypted = $OpensslEncryption->decrypt($encrypted, ENCRYPTION_KEY);

1
এটি আরও ভাল এবং নিরাপদ সংস্করণ। ধন্যবাদ, এটি প্রত্যাশার মতো কাজ করে।

1
আপনি কীভাবে তৈরি করবেন এবং কোথায় আপনি এনক্রিপশন কীটি রাখবেন?
ব্যবহারকারী 2800464

7

Noteতিহাসিক দ্রষ্টব্য: এটি পিএইচপি 4 এর সময়ে লেখা হয়েছিল। এটিকে আমরা এখন "লিগ্যাসি কোড" বলি।

আমি এই উত্তরটি historicalতিহাসিক উদ্দেশ্যে রেখেছি - তবে কয়েকটি পদ্ধতির এখন অবচয় করা হয়েছে, ডিইএস এনক্রিপশন পদ্ধতি কোনও প্রস্তাবিত অনুশীলন নয়, ইত্যাদি etc.

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

আপনি যদি একইভাবে সরল, "ডামিদের জন্য পিএইচপি এনক্রিপশন" ধরণের উত্স খুঁজে পান যা লোকেরা 10-10 কোডের কম লাইন বা তার চেয়ে কম ক্ষেত্রে শুরু করতে পারে তবে আমাকে মন্তব্যে জানাতে দিন।

এর বাইরে, দয়া করে প্রারম্ভিক যুগের পিএইচপি 4 সংক্ষিপ্ত এনক্রিপশন উত্তরের এই ক্লাসিক পর্বটি উপভোগ করুন।


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

//Listing 3: Encrypting Data Using the mcrypt_ecb Function 

<?php 
echo("<h3> Symmetric Encryption </h3>"); 
$key_value = "KEYVALUE"; 
$plain_text = "PLAINTEXT"; 
$encrypted_text = mcrypt_ecb(MCRYPT_DES, $key_value, $plain_text, MCRYPT_ENCRYPT); 
echo ("<p><b> Text after encryption : </b>"); 
echo ( $encrypted_text ); 
$decrypted_text = mcrypt_ecb(MCRYPT_DES, $key_value, $encrypted_text, MCRYPT_DECRYPT); 
echo ("<p><b> Text after decryption : </b>"); 
echo ( $decrypted_text ); 
?> 

কয়েকটি সতর্কতা:

1) যখন একমুখী হ্যাশ করবে তখন কখনই বিপরীতমুখী, বা "প্রতিসামান্য" এনক্রিপশন ব্যবহার করবেন না।

2) ডেটা যদি সত্যই সংবেদনশীল হয় যেমন ক্রেডিট কার্ড বা সামাজিক সুরক্ষা নম্বরগুলি, বন্ধ করুন; আপনার যে কোনও সাধারণ কোডের কোড সরবরাহ করবে তার চেয়ে বেশি প্রয়োজন, তবে এই উদ্দেশ্যে ডিজাইন করা আপনার একটি ক্রিপ্টো লাইব্রেরি এবং প্রয়োজনীয় পদ্ধতিগুলি গবেষণা করার জন্য একটি উল্লেখযোগ্য পরিমাণ সময় প্রয়োজন। আরও, সফ্টওয়্যার ক্রিপ্টোটি সম্ভবত সংবেদনশীল ডেটার সুরক্ষার <10% < এটি একটি পারমাণবিক বিদ্যুৎ কেন্দ্র পুনর্নির্মাণের মতো - এই বিষয়টি যদি কাজটি হয় তবে তা বিপজ্জনক এবং কঠিন এবং আপনার জ্ঞানের বাইরেও তা গ্রহণ করুন। আর্থিক জরিমানা অপরিসীম হতে পারে, তাই তাদের কাছে কোনও পরিষেবা এবং জাহাজের দায়বদ্ধতা ব্যবহার করা আরও ভাল।

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

এটি যেমন হতে পারে, মজা করুন :)


9
ইও, ডিইএস এইএস কোথায়?
পাতাসু

2
ধন্যবাদ! তবে কিছু বিষয়। আমি M�������f=�_=এনক্রিপ্ট হওয়া হিসাবে অদ্ভুত চরিত্রগুলি পাচ্ছি । আমি কি সহজ চরিত্র পেতে পারি না? ভালো লেগেছে: 2a2ffa8f13220befbe30819047e23b2c। এছাড়াও, আমি কি LENGTH $key_value(8 টির সাথে নির্ধারিত) এবং আউটপুটটির LENGTH পরিবর্তন করতে পারি না $encrypted_text? (এটি 32 বা 64 দীর্ঘ বা আর কিছু হতে পারে না ??)

3
@ 夏 期 劇場 এনক্রিপশনের ফলাফল হ'ল বাইনারি ডেটা। আপনার যদি এটি মানব পাঠযোগ্য হওয়ার প্রয়োজন হয় তবে এটিতে বেস 64 বা হেক্স এনকোডিং ব্যবহার করুন। 'আমি কী মূল্যের দৈর্ঘ্যটি পরিবর্তন করতে পারি না?' বিভিন্ন প্রতিসাম্য এনক্রিপশন অ্যালগরিদমের কী মানটির জন্য আলাদা প্রয়োজনীয়তা রয়েছে। 'এবং আউটপুট এর দৈর্ঘ্য ...' এনক্রিপ্ট করা পাঠ্যের দৈর্ঘ্য কমপক্ষে মূল পাঠ্যের হিসাবে দীর্ঘ হওয়া উচিত, অন্যথায় মূল পাঠ্যটি পুনরায় তৈরি করার জন্য পর্যাপ্ত তথ্য নেই। (এটি পায়রাহোল নীতির একটি প্রয়োগ)) বিটিডাব্লু, আপনার ডিইএসের পরিবর্তে এইএস ব্যবহার করা উচিত। ডিইএস সহজেই ভাঙ্গনযোগ্য এবং আর সুরক্ষিত নয়।
পাতাসু

8
mcrypt_ecb পিএইচপি 5.5.0 হিসাবে অবজ্ঞা করা হয়েছে এই ফাংশন উপর নির্ভর করা অত্যন্ত নিরুৎসাহিত করা হয়। php.net/manual/en/function.mcrypt-ecb.php
হাফেজ

1
@ ব্রায়ানহল এটি এখনও ডাউন-ভোট পাওয়ার কারণ হ'ল ইসিবি মোডটি নিরাপদ নয় (সিবিসি, সিটিআর, জিসিএম, বা পলি 1305 ব্যবহার করুন), ডিইএস দুর্বল (আপনি এইএস চান, যা MCRYPT_RIJNDAEL_128) এবং সিফেরেক্সটেক্সগুলি প্রমাণীকরণ করা উচিত ( hash_hmac(), যাচাই করা উচিত) সহ hash_equals())।
স্কট আর্কিসজেউসকি

7

আপনি যদি গ্রন্থাগার (যা আপনার উচিত) ব্যবহার করতে না চান তবে এর মতো কিছু ব্যবহার করুন (পিএইচপি 7):

function sign($message, $key) {
    return hash_hmac('sha256', $message, $key) . $message;
}

function verify($bundle, $key) {
    return hash_equals(
      hash_hmac('sha256', mb_substr($bundle, 64, null, '8bit'), $key),
      mb_substr($bundle, 0, 64, '8bit')
    );
}

function getKey($password, $keysize = 16) {
    return hash_pbkdf2('sha256',$password,'some_token',100000,$keysize,true);
}

function encrypt($message, $password) {
    $iv = random_bytes(16);
    $key = getKey($password);
    $result = sign(openssl_encrypt($message,'aes-256-ctr',$key,OPENSSL_RAW_DATA,$iv), $key);
    return bin2hex($iv).bin2hex($result);
}

function decrypt($hash, $password) {
    $iv = hex2bin(substr($hash, 0, 32));
    $data = hex2bin(substr($hash, 32));
    $key = getKey($password);
    if (!verify($data, $key)) {
      return null;
    }
    return openssl_decrypt(mb_substr($data, 64, null, '8bit'),'aes-256-ctr',$key,OPENSSL_RAW_DATA,$iv);
}

$string_to_encrypt='John Smith';
$password='password';
$encrypted_string=encrypt($string_to_encrypt, $password);
$decrypted_string=decrypt($encrypted_string, $password);

এটি কি স্ট্যাকওভারফ্লো . com/ a/ 16606352/126833 এর প্রতিস্থাপন হতে পারে ? আমার হোস্টটি পিএইচপি 7.2-তে আপগ্রেড না হওয়া পর্যন্ত আমি প্রাক্তনটি ব্যবহার করেছি।
অঞ্জনেশ

@ অঞ্জনেশ আপনি এই একের সাহায্যে পুরানো ডেটা ডিক্রিপ্ট করতে পারবেন না (বিভিন্ন অ্যালগোরিদম + এটিও স্বাক্ষর পরীক্ষা করে)
এসকন

2
আপনার ক্ষেত্রে সম্ভবত এটি করা উচিত:define("ENCRYPTION_KEY", "123456*"); $string = "This is the original data string!"; $encrypted = openssl_encrypt($string, 'BF-ECB', ENCRYPTION_KEY); $decrypted = openssl_decrypt($encrypted,'BF-ECB',ENCRYPTION_KEY);
Ascon

এটি সুপার!
অঞ্জনেশ

2

এএএস 256 সিবিসি ব্যবহার করে পিএইচপি দিয়ে স্ট্রিংগুলি এনক্রিপ্ট / ডিক্রিপ্ট করার এই কমপ্যাক্ট পদ্ধতি :

function encryptString($plaintext, $password, $encoding = null) {
    $iv = openssl_random_pseudo_bytes(16);
    $ciphertext = openssl_encrypt($plaintext, "AES-256-CBC", hash('sha256', $password, true), OPENSSL_RAW_DATA, $iv);
    $hmac = hash_hmac('sha256', $ciphertext.$iv, hash('sha256', $password, true), true);
    return $encoding == "hex" ? bin2hex($iv.$hmac.$ciphertext) : ($encoding == "base64" ? base64_encode($iv.$hmac.$ciphertext) : $iv.$hmac.$ciphertext);
}

function decryptString($ciphertext, $password, $encoding = null) {
    $ciphertext = $encoding == "hex" ? hex2bin($ciphertext) : ($encoding == "base64" ? base64_decode($ciphertext) : $ciphertext);
    if (!hash_equals(hash_hmac('sha256', substr($ciphertext, 48).substr($ciphertext, 0, 16), hash('sha256', $password, true), true), substr($ciphertext, 16, 32))) return null;
    return openssl_decrypt(substr($ciphertext, 48), "AES-256-CBC", hash('sha256', $password, true), OPENSSL_RAW_DATA, substr($ciphertext, 0, 16));
}

ব্যবহার:

$enc = encryptString("mysecretText", "myPassword");
$dec = decryptString($enc, "myPassword");

0

কোডের নীচে পিএইচপি তে সমস্ত চরিত্রের জন্য বিশেষ অক্ষর সহ কাজ করা হয়

   // Encrypt text --

    $token = "9611222007552";

      $cipher_method = 'aes-128-ctr';
      $enc_key = openssl_digest(php_uname(), 'SHA256', TRUE);  
      $enc_iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher_method));  
      $crypted_token = openssl_encrypt($token, $cipher_method, $enc_key, 0, $enc_iv) . "::" . bin2hex($enc_iv);
    echo    $crypted_token;
    //unset($token, $cipher_method, $enc_key, $enc_iv);

    // Decrypt text  -- 

    list($crypted_token, $enc_iv) = explode("::", $crypted_token);  
      $cipher_method = 'aes-128-ctr';
      $enc_key = openssl_digest(php_uname(), 'SHA256', TRUE);
      $token = openssl_decrypt($crypted_token, $cipher_method, $enc_key, 0, hex2bin($enc_iv));
    echo   $token;
    //unset($crypted_token, $cipher_method, $enc_key, $enc_iv);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.