আপনি আরও কিছু করার আগে, এনক্রিপশন এবং প্রমাণীকরণের মধ্যে পার্থক্যটি বোঝার চেষ্টা করুন এবং কেন আপনি সম্ভবত কেবল এনক্রিপশন না করে সত্যায়িত এনক্রিপশন চান ।
অনুমোদনপ্রাপ্ত এনক্রিপশন প্রয়োগ করতে, আপনি ম্যাকটি এনক্রিপ্ট করতে চান। এনক্রিপশন এবং প্রমাণীকরণের ক্রমটি খুব গুরুত্বপূর্ণ! এই প্রশ্নের বিদ্যমান উত্তরগুলির মধ্যে একটি এই ভুল করেছে; যেমন পিএইচপি-তে লেখা অনেকগুলি ক্রিপ্টোগ্রাফি গ্রন্থাগার রয়েছে।
আপনার নিজের ক্রিপ্টোগ্রাফি প্রয়োগ করা এড়ানো উচিত এবং পরিবর্তে ক্রিপ্টোগ্রাফি বিশেষজ্ঞদের দ্বারা লিখিত এবং পর্যালোচনা করা একটি সুরক্ষিত গ্রন্থাগার ব্যবহার করা উচিত ।
আপডেট: পিএইচপি 7.2 এখন লিবসডিয়াম সরবরাহ করে ! সেরা সুরক্ষার জন্য, পিএইচপি .2.২ বা উচ্চতর ব্যবহার করার জন্য আপনার সিস্টেমগুলি আপডেট করুন এবং কেবলমাত্র এই উত্তরে লিবসোডিয়াম পরামর্শ অনুসরণ করুন।
আপনার যদি পিইসিএল অ্যাক্সেস থাকে তবে লাইবসোডিয়াম ব্যবহার করুন (বা পিইসিএল ছাড়াই যদি সোডিয়াম_কম্প্যাট চান তবে লাইবসিয়াম); অন্যথায় ...
ডিফিউজ / পিএইচপি-এনক্রিপশন ব্যবহার করুন ; আপনার নিজস্ব ক্রিপ্টোগ্রাফি রোল করবেন না!
উপরের সাথে সংযুক্ত দুটি লাইব্রেরি আপনার নিজের লাইব্রেরিতে প্রমাণীকৃত এনক্রিপশন প্রয়োগ করা সহজ এবং বেদনাদায়ক করে তোলে।
আপনি যদি এখনও নিজের ক্রিপ্টোগ্রাফি গ্রন্থাগারটি লিখতে এবং স্থাপন করতে চান তবে ইন্টারনেটের প্রতিটি ক্রিপ্টোগ্রাফি বিশেষজ্ঞের প্রচলিত জ্ঞানের বিপরীতে, এই পদক্ষেপগুলি আপনাকে নিতে হবে।
জোড়া লাগানো:
- সিটিআর মোডে AES ব্যবহার করে এনক্রিপ্ট করুন। আপনি জিসিএম (যা পৃথক ম্যাকের প্রয়োজনীয়তা সরিয়ে দেয়) ব্যবহার করতে পারেন। অতিরিক্তভাবে, চ্যাচ20 এবং সালসা20 ( লাইবসোডিয়াম দ্বারা সরবরাহিত ) স্ট্রিম সাইফার এবং বিশেষ মোডের প্রয়োজন হয় না।
- আপনি উপরে জিসিএম না চয়ন না করে আপনার HMAC-SHA-256 (অথবা, স্ট্রিম সাইফারগুলির জন্য, Poly1305 - বেশিরভাগ লিবসোডিয়াম এপিআই আপনার জন্য এটি করে) দিয়ে সিফারেক্সটটি অনুমোদন করা উচিত। ম্যাকের আইভির পাশাপাশি সিফারটেক্সটটিও কভার করা উচিত!
ডিক্রিপশন:
- Poly1305 বা GCM ব্যবহার না করা অবধি সাইফারটেক্সটের ম্যাককে পুনরায় গণনা করুন এবং যে ম্যাক ব্যবহার করে প্রেরণ করা হয়েছিল তা এটির সাথে তুলনা করুন
hash_equals()
। যদি এটি ব্যর্থ হয় তবে গর্ভপাত বন্ধ করুন।
- বার্তাটি ডিক্রিপ্ট করুন।
অন্যান্য নকশা বিবেচনা:
- কখনও কিছু সংকুচিত করবেন না। সিফেরেক্সটেক্স কমপ্রেসযোগ্য নয়; এনক্রিপশন করার আগে প্লেটেক্সট সংক্ষেপে তথ্য ফাঁস হতে পারে (যেমন সিআরআইএম এবং টিএলএসে পাঠান)।
- সমস্যাগুলি রোধ করতে আপনি অক্ষর সেট মোড ব্যবহার করেছেন
mb_strlen()
এবং তা নিশ্চিত করুন ।mb_substr()
'8bit'
mbstring.func_overload
- আইভিগুলি একটি সিএসপিআরএনজি ব্যবহার করে উত্পন্ন করা উচিত ; আপনি ব্যবহার করেন, তাহলে
mcrypt_create_iv()
, ব্যবহার করবেন নাMCRYPT_RAND
!
- আপনি যদি কোনও এএইডি কনস্ট্রাক্ট না ব্যবহার করেন তবে সর্বদা ম্যাকটি এনক্রিপ্ট করুন!
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-অক্ষরের পাসওয়ার্ড ব্যবহার করবেন না। আপনার এনক্রিপশন কীটি হাস্যকরভাবে ভেঙে যাবে।