কীভাবে পিএইচপি-তে ডাটা এনক্রিপ্ট / ডিক্রিপ্ট করবেন?


110

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

আমি যা করার চেষ্টা করছি তা এখানে:

এই ক্ষেত্রগুলি নিয়ে আমার একটি টেবিল রয়েছে (ইউজারআইডি, নাম, নাম, ইমেল, পাসওয়ার্ড)

আমি যা করতে চাই তা হ'ল সমস্ত ক্ষেত্র এনক্রিপ্ট করা হবে এবং তারপরে ডিক্রিপ্ট করা হবে ( sha256কোনও এনক্রিপশন অ্যালগরিদম না থাকলে কি এনক্রিপশন / ডিক্রিপশন জন্য ব্যবহার করা সম্ভব )

আরেকটি জিনিস আমি শিখতে চাই তা হল hash(sha256)একটি ভাল "লবণের" সাথে একত্রে কীভাবে উপায় তৈরি করা যায় । (মূলত আমি কেবল এনক্রিপশন / ডিক্রিপশন এর একটি সহজ প্রয়োগ করতে চাই, hash(sha256)+salt) স্যার / ম্যাম, আপনার উত্তরগুলি খুব সহায়ক হবে এবং অনেক প্রশংসা হবে Thank ধন্যবাদ ++




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

7
আপনি সাধারণত একটি পাসওয়ার্ড ডিক্রিপ্ট করতে সক্ষম হতে চান না!
জ্যাক

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

উত্তর:


289

ভূমিকা

আপনার টেবিল সংজ্ঞা দিয়ে শুরু:

- UserID
- Fname
- Lname
- Email
- Password
- IV

পরিবর্তনগুলি এখানে:

  1. ক্ষেত্র Fname, Lnameএবং Emailএকটি প্রতিসম সাইফার, দ্বারা উপলব্ধ ব্যবহার করে এনক্রিপ্ট করা হবে না দ্বারা OpenSSL ,
  2. IVক্ষেত্র সংরক্ষণ করবে initialisation ভেক্টর এনক্রিপশন জন্য ব্যবহৃত। স্টোরেজ প্রয়োজনীয়তা ব্যবহৃত সাইফার এবং মোড উপর নির্ভর করে; এই সম্পর্কে আরও পরে।
  3. Passwordক্ষেত্রটিতে কোনও ব্যবহার কুচি-কুচি করিয়া কাটা বস্তু হবে একমুখী , পাসওয়ার্ড হ্যাশ

জোড়া লাগানো

সাইফার এবং মোড

সেরা এনক্রিপশন সাইফার এবং মোড নির্বাচন করা এই উত্তরের ক্ষেত্রের বাইরে, তবে চূড়ান্ত পছন্দটি এনক্রিপশন কী এবং প্রারম্ভিককরণ ভেক্টর উভয়ের আকারকে প্রভাবিত করে; এই পোস্টের জন্য আমরা AES-256-CBC ব্যবহার করব যা 16 বাইটের একটি নির্দিষ্ট আকারের আকার এবং 16, 24 বা 32 বাইটের মূল আকার size

এনক্রিপশন কী

একটি ভাল এনক্রিপশন কী হ'ল একটি বাইনারি ব্লব যা একটি নির্ভরযোগ্য র্যান্ডম নম্বর জেনারেটর থেকে উত্পন্ন হয়। নিম্নলিখিত উদাহরণটি সুপারিশ করা হবে (> = 5.3):

$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe

এটি একবার বা একাধিকবার করা যেতে পারে (আপনি যদি এনক্রিপশন কীগুলির একটি শৃঙ্খলা তৈরি করতে চান)। এগুলি যথাসম্ভব ব্যক্তিগত রাখুন।

চতুর্থ

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

আইভি উত্পাদন করতে আপনাকে সহায়তা করার জন্য একটি ফাংশন সরবরাহ করা হয়েছে:

$iv_size = 16; // 128 bits
$iv = openssl_random_pseudo_bytes($iv_size, $strong);

উদাহরণ

পূর্বের $encryption_keyএবং ব্যবহার করে নাম ক্ষেত্রটি এনক্রিপ্ট করা যাক $iv; এটি করতে, আমাদের ব্লক আকারে আমাদের ডেটা প্যাড করতে হবে:

function pkcs7_pad($data, $size)
{
    $length = $size - strlen($data) % $size;
    return $data . str_repeat(chr($length), $length);
}

$name = 'Jack';
$enc_name = openssl_encrypt(
    pkcs7_pad($name, 16), // padded data
    'AES-256-CBC',        // cipher and mode
    $encryption_key,      // secret key
    0,                    // options (not used)
    $iv                   // initialisation vector
);

স্টোরেজ প্রয়োজনীয়তা

আইভির মতো এনক্রিপ্ট করা আউটপুট বাইনারি হয়; ডাটাবেসে এই মানগুলি সংরক্ষণ করে নির্ধারিত কলামের প্রকার যেমন BINARYবা ব্যবহার করে সম্পন্ন করা যায় VARBINARY

IV এর মতো আউটপুট মান বাইনারি হয়; মাইএসকিউএলে এই মানগুলি সঞ্চয় করতে, কলামগুলি ব্যবহার BINARYবাVARBINARY বিবেচনা করুন । যদি এটি কোনও বিকল্প না হয় তবে আপনি বাইনারি ডেটাটিকে ব্যবহার করে পাঠ্য উপস্থাপনায় রূপান্তর করতে পারেন base64_encode()বা bin2hex()এটির জন্য 33% থেকে 100% বেশি স্টোরেজ স্পেসের প্রয়োজন হয়।

ডিক্রিপশন

সঞ্চিত মানগুলির ডিক্রিপশন একই:

function pkcs7_unpad($data)
{
    return substr($data, 0, -ord($data[strlen($data) - 1]));
}

$row = $result->fetch(PDO::FETCH_ASSOC); // read from database result
// $enc_name = base64_decode($row['Name']);
// $enc_name = hex2bin($row['Name']);
$enc_name = $row['Name'];
// $iv = base64_decode($row['IV']);
// $iv = hex2bin($row['IV']);
$iv = $row['IV'];

$name = pkcs7_unpad(openssl_decrypt(
    $enc_name,
    'AES-256-CBC',
    $encryption_key,
    0,
    $iv
));

প্রমাণীকৃত এনক্রিপশন

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

উদাহরণ

// generate once, keep safe
$auth_key = openssl_random_pseudo_bytes(32, $strong);

// authentication
$auth = hash_hmac('sha256', $enc_name, $auth_key, true);
$auth_enc_name = $auth . $enc_name;

// verification
$auth = substr($auth_enc_name, 0, 32);
$enc_name = substr($auth_enc_name, 32);
$actual_auth = hash_hmac('sha256', $enc_name, $auth_key, true);

if (hash_equals($auth, $actual_auth)) {
    // perform decryption
}

আরো দেখুন: hash_equals()

হ্যাশ

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

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

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

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

বর্তমানে দুটি জনপ্রিয় পছন্দ উপলব্ধ রয়েছে:

  1. PBKDF2 (পাসওয়ার্ড ভিত্তিক কী ডেরিভেশন ফাংশন v2)
  2. বিসিআরপিট (ওরফে ব্লোফিশ)

এই উত্তরটি bcrypt সহ একটি উদাহরণ ব্যবহার করবে।

প্রজন্ম

একটি পাসওয়ার্ড হ্যাশ এভাবে তৈরি করা যেতে পারে:

$password = 'my password';
$random = openssl_random_pseudo_bytes(18);
$salt = sprintf('$2y$%02d$%s',
    13, // 2^n cost factor
    substr(strtr(base64_encode($random), '+', '.'), 0, 22)
);

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

লবণের সাথে openssl_random_pseudo_bytes()ডেটা তৈরি করা হয় যা এলোমেলো ব্লবের ডেটা তৈরি করে যা এরপরে চালিত হয় base64_encode()এবং strtr()প্রয়োজনীয় বর্ণমালার সাথে মেলে [A-Za-z0-9/.]

crypt()কর্ম সঞ্চালিত আলগোরিদিম (উপর ভিত্তি করে হ্যাশ $2y$পটকা মাছ জন্য), খরচ ফ্যাক্টর 22 অক্ষরের লবণ (13 একটি গুণক একটি 3GHz মেশিনে মোটামুটিভাবে 0.40s নেয়)।

ভ্যালিডেশন

একবার আপনি ব্যবহারকারীর তথ্য সম্বলিত সারিটি আনার পরে, আপনি এই পদ্ধতিতে পাসওয়ার্ডটি বৈধতা দিন:

$given_password = $_POST['password']; // the submitted password
$db_hash = $row['Password']; // field with the password hash

$given_hash = crypt($given_password, $db_hash);

if (isEqual($given_hash, $db_hash)) {
    // user password verified
}

// constant time string compare
function isEqual($str1, $str2)
{
    $n1 = strlen($str1);
    if (strlen($str2) != $n1) {
        return false;
    }
    for ($i = 0, $diff = 0; $i != $n1; ++$i) {
        $diff |= ord($str1[$i]) ^ ord($str2[$i]);
    }
    return !$diff;
}

একটি পাসওয়ার্ড যাচাই করতে, আপনি crypt()আবার কল করেন তবে আপনি আগের গণনা করা হ্যাশকে লবণের মান হিসাবে পাস করেন। প্রদত্ত পাসওয়ার্ড হ্যাশের সাথে মিলে গেলে ফেরতের মান একই হ্যাশ দেয় yield হ্যাশ যাচাই করতে, সময় সময় আক্রমণ এড়াতে প্রায়শই একটি ধ্রুবক-সময় তুলনা ফাংশন ব্যবহার করার পরামর্শ দেওয়া হয়।

পিএইচপি 5.5 সহ পাসওয়ার্ড হ্যাশিং

পিএইচপি 5.5 পাসওয়ার্ড হ্যাশিং ফাংশনগুলি প্রবর্তন করেছে যা আপনি উপরের পদ্ধতিটি হ্যাশিং সহজ করার জন্য ব্যবহার করতে পারেন:

$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 13]);

এবং যাচাই করা হচ্ছে:

if (password_verify($given_password, $db_hash)) {
    // password valid
}

আরও দেখুন: password_hash(),password_verify()


নিরাপদ বাজি রাখার জন্য নাম, নাম, ইমেল ইত্যাদি সঞ্চয় করতে আমার কত দৈর্ঘ্য ব্যবহার করা উচিত? ভেরিবিনারি (???)
বেন্টকডার

2
অবশ্যই, তবে এটি কীভাবে ব্যবহৃত হচ্ছে তার উপর নির্ভর করে। আপনি যদি কোনও এনক্রিপশন লাইব্রেরি প্রকাশ করেন তবে আপনি কীভাবে বিকাশকারীরা এটি প্রয়োগ করবেন তা জানেন না। এ কারণেই github.com/defuse/php- এনক্রিপশনটি প্রমাণীকৃত প্রতিসাম্য-কী এনক্রিপশন সরবরাহ করে এবং বিকাশকারীদের কোড সম্পাদনা না করে এটিকে দুর্বল হতে দেয় না।
স্কট আর্কিসজেউস্কি

2
@ স্কট খুব ভাল, আমি প্রমাণীকৃত এনক্রিপশনের একটি উদাহরণ যুক্ত করেছি; ধাক্কা দেওয়ার জন্য ধন্যবাদ :)
জ্যাক

1
প্রমাণীকৃত এনক্রিপশনের জন্য +1। প্রশ্নে পর্যাপ্ত তথ্য নেই যে এখানে বলার অপেক্ষা রাখে না যে এই এখানে প্রয়োজনীয় নয়। অবশ্যই এসকিউএল ট্র্যাফিক প্রায়শই অজানা সুরক্ষা বৈশিষ্ট্যযুক্ত নেটওয়ার্কের উপর দিয়ে যায়, যেমনটি ডাটাবেস থেকে স্টোরেজ পর্যন্ত ট্র্যাফিক। ব্যাকআপ এবং প্রতিলিপি। হুমকির মডেল কী? প্রশ্নটি বলে না এবং অনুমান করা বিপজ্জনক হতে পারে।
জেসন ওরেডরফ

1
হার্ড-কোডিংয়ের পরিবর্তে $iv_size = 16;, আমি ব্যবহার করব: $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length("AES-256-CBC"))ব্যবহৃত সাইফারের সাথে আইভির আকারের মধ্যে লিঙ্কটি নির্দেশ করতে। আপনি pkcs7_pad()/ এর প্রয়োজনে (বা না) কিছুটা প্রসারিত করতে পারেন pkcs7_unpad(), বা কেবল এগুলি থেকে মুক্তি পেয়ে পোস্টটি সরল করে "এস -২ a6-সিটিআর" ব্যবহার করতে পারেন। জ্যাক
প্যাট্রিক অ্যালার্ট

24

আমি মনে করি এর আগে এর জবাব দেওয়া হয়েছে ... তবে যাইহোক, আপনি যদি ডেটা এনক্রিপ্ট / ডিক্রিপ্ট করতে চান তবে আপনি SHA256 ব্যবহার করতে পারবেন না

//Key
$key = 'SuperSecretKey';

//To Encrypt:
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, 'I want to encrypt this', MCRYPT_MODE_ECB);

//To Decrypt:
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_ECB);

7
সে ক্ষেত্রে আপনার ইসিবি ব্যবহার করা উচিত নয়।
মার্টেন বোদেউইস

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

4
MCRYPT_RIJNDAEL_256 কোনও মানকৃত ফাংশন নয়, আপনার AES ব্যবহার করা উচিত (MCRYPT_RIJNDAEL_128)
মার্টেন বোদেউইস

14

উত্তর পটভূমি এবং ব্যাখ্যা

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

কি আপনি ব্যবহার করতে চান একটি দ্বিমুখী ফাংশন, কিন্তু আরো নির্দিষ্টভাবে, একটি হল ব্লক সাইফার । এমন একটি ফাংশন যা ডেটা এনক্রিপশন এবং ডিক্রিপশন উভয়ের জন্য মঞ্জুরি দেয়। ফাংশনগুলি mcrypt_encryptএবং mcrypt_decryptডিফল্টরূপে ব্লোফিশ আলগোরিদিম ব্যবহার করে। পিএইচপি-র এমক্রিপ্টের ব্যবহার এই ম্যানুয়ালটিতে পাওয়া যাবে । একটি তালিকা সাইফার সংজ্ঞা সাইফার mcrypt নির্বাচন করতে ব্যবহার এছাড়াও বিদ্যমান। ব্লোফিশের একটি উইকি উইকিপিডিয়ায় পাওয়া যাবে । একটি ব্লক সাইফার জ্ঞাত আকার এবং অবস্থানের ব্লকের ইনপুটটিকে একটি ज्ञিত কী সহ এনক্রিপ্ট করে, যাতে কীটি ব্যবহার করে ডেটা পরে ডিক্রিপ্ট করা যায়। এটি SHA256 আপনাকে সরবরাহ করতে পারে না।

কোড

$key = 'ThisIsTheCipherKey';

$ciphertext = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, 'This is plaintext.', MCRYPT_MODE_CFB);

$plaintext = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $encrypted, MCRYPT_MODE_CFB);

সে ক্ষেত্রে আপনার ইসিবি ব্যবহার করা উচিত নয়।
মার্টেন বোদেউইস

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

4
কখনও ইসিবি মোড ব্যবহার করবেন না। এটি অনিরাপদ এবং বেশিরভাগ সময় প্রকৃতপক্ষে ডেটা এনক্রিপ্ট করতে সহায়তা করে না (কেবল এটি কেবল এনকোডিংয়ের চেয়ে)। দেখুন বিষয়ে চমৎকার Wikipedia নিবন্ধটি দেখুন।
হোলগার জাস্ট

1
এমক্রিপ্ট না ব্যবহার করা সবচেয়ে ভাল, এটি পরিত্যক্ত বিষয়, বছরের পর বছর আপডেট করা হয়নি এবং মানক পিকেসিএস # 7 (পিপিসিএস # 5) প্যাডিং সমর্থন করে না, কেবল অ-মানক নাল প্যাডিং যা বাইনারি ডেটা দিয়েও ব্যবহার করা যায় না । mcrypt অনেক অসামান্য ছিল বাগ 2003 ফিরে ডেটিং .. পরিবর্তে ব্যবহারের বিষয়ে বিবেচনা নিস্ক্রিয় , এটা বজায় রাখা হচ্ছে এবং সঠিক।
জাফ

9

ওপেনসেল_ইনক্রিপ্ট ব্যবহার করে এখানে একটি উদাহরণ দেওয়া আছে

//Encryption:
$textToEncrypt = "My Text to Encrypt";
$encryptionMethod = "AES-256-CBC";
$secretHash = "encryptionhash";
$iv = mcrypt_create_iv(16, MCRYPT_RAND);
$encryptedText = openssl_encrypt($textToEncrypt,$encryptionMethod,$secretHash, 0, $iv);

//Decryption:
$decryptedText = openssl_decrypt($encryptedText, $encryptionMethod, $secretHash, 0, $iv);
print "My Decrypted Text: ". $decryptedText;

2
পরিবর্তে mcrypt_create_iv(), আমি openssl_random_pseudo_bytes(openssl_cipher_iv_length($encryptionMethod))ব্যবহার করব:, পদ্ধতিটি $ এনক্রিপশনমথোডের কোনও মানের জন্য কাজ করে এবং কেবল ওপেনসেল এক্সটেনশন ব্যবহার করবে।
প্যাট্রিক অ্যালার্ট

উপরের কোডটি এর falseজন্য প্রদান করে openssl_decrypt()স্ট্যাকওভারফ্লো.com/q/41952509/1066234 দেখুন যেহেতু এইএসের মতো ব্লক সাইফারগুলিকে ইনপুট ডেটার প্রয়োজন ব্লকের আকারের (এইএসের জন্য 16 বাইট) প্যাডিংয়ের সঠিক একাধিক হওয়া।
কাই নোক

6
     function my_simple_crypt( $string, $action = 'e' ) {
        // you may change these values to your own
        $secret_key = 'my_simple_secret_key';
        $secret_iv = 'my_simple_secret_iv';

        $output = false;
        $encrypt_method = "AES-256-CBC";
        $key = hash( 'sha256', $secret_key );
        $iv = substr( hash( 'sha256', $secret_iv ), 0, 16 );

        if( $action == 'e' ) {
            $output = base64_encode( openssl_encrypt( $string, $encrypt_method, $key, 0, $iv ) );
        }
        else if( $action == 'd' ){
            $output = openssl_decrypt( base64_decode( $string ), $encrypt_method, $key, 0, $iv );
        }

        return $output;
    }

খুব সহজ ! আমি এটি ইউআরএল বিভাগের এনক্রিপশন-ডিক্রিপশন জন্য ব্যবহার করি। ধন্যবাদ
মাহবুব টিটো

0

এটি falseব্যবহার openssl_decrypt()করতে এবং এনক্রিপ্ট এবং ডিক্রিপ্ট করার কাজ করার সময় কীভাবে পাবেন না তা নির্ধারণ করতে আমার বেশ কিছুটা সময় লেগেছিল ।

    // cryptographic key of a binary string 16 bytes long (because AES-128 has a key size of 16 bytes)
    $encryption_key = '58adf8c78efef9570c447295008e2e6e'; // example
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    $encrypted = openssl_encrypt($plaintext, 'aes-256-cbc', $encryption_key, OPENSSL_RAW_DATA, $iv);
    $encrypted = $encrypted . ':' . base64_encode($iv);

    // decrypt to get again $plaintext
    $parts = explode(':', $encrypted);
    $decrypted = openssl_decrypt($parts[0], 'aes-256-cbc', $encryption_key, OPENSSL_RAW_DATA, base64_decode($parts[1])); 

আপনি যদি কোনও URL এর মাধ্যমে এনক্রিপ্ট করা স্ট্রিংটি পাস করতে চান তবে আপনার স্ট্রিংটি ইউলিংকোড করা দরকার:

    $encrypted = urlencode($encrypted);

কী চলছে তা আরও ভালভাবে বুঝতে, পড়ুন:

16 বাইট দীর্ঘ কী তৈরি করতে আপনি ব্যবহার করতে পারেন:

    $bytes = openssl_random_pseudo_bytes(16);
    $hex = bin2hex($bytes);

ওপেনসেলের ত্রুটি বার্তা দেখতে আপনি ব্যবহার করতে পারেন: echo openssl_error_string();

আশা করি এইটি কাজ করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.