গুরুত্বপূর্ণ : আপনার যদি খুব নির্দিষ্ট ব্যবহারের ক্ষেত্রে না থাকে তবে পাসওয়ার্ডগুলি এনক্রিপ্ট করবেন না , পরিবর্তে পাসওয়ার্ড হ্যাশিং অ্যালগরিদম ব্যবহার করুন। যখন কেউ বলে যে তারা সার্ভার-সাইড অ্যাপ্লিকেশনটিতে তাদের পাসওয়ার্ডগুলি এনক্রিপ্ট করেছে, তারা হয় অজানা বা তারা একটি বিপজ্জনক সিস্টেমের নকশা বর্ণনা করছে। পাসওয়ার্ডগুলি নিরাপদে সংরক্ষণ করা এনক্রিপশন থেকে সম্পূর্ণ পৃথক সমস্যা।
অবহিত হতে হবে। নিরাপদ সিস্টেম ডিজাইন।
পিএইচপি-তে পোর্টেবল ডেটা এনক্রিপশন
আপনি যদি পিএইচপি 5.4 বা তার থেকেও বেশি ব্যবহার করে থাকেন এবং নিজে কোনও ক্রিপ্টোগ্রাফি মডিউল লিখতে না চান তবে আমি একটি বিদ্যমান লাইব্রেরি ব্যবহার করার পরামর্শ দিচ্ছি যা প্রমাণীকৃত এনক্রিপশন সরবরাহ করে । আমি যে লাইব্রেরিটি সংযুক্ত করেছি তা কেবলমাত্র পিএইচপি সরবরাহ করে এবং তার উপর নির্ভর করে মুষ্টিমেয় নিরাপত্তা গবেষকরা ic (নিজেকে অন্তর্ভুক্ত।)
আপনার বহনযোগ্যতা গোল PECL এক্সটেনশন প্রয়োজন প্রতিরোধ না থাকে, তাহলে libsodium হয় অত্যন্ত কিছুর উপর সুপারিশ আপনি বা আমি পিএইচপি লিখতে পারেন।
আপডেট (২০১-0-০6-১২): আপনি এখন সোডিয়াম_কম্প্যাট ব্যবহার করতে পারেন এবং পিইসিএল এক্সটেনশানগুলি ইনস্টল না করে একই ক্রিপ্টো লাইবসোডিয়াম অফারগুলি ব্যবহার করতে পারেন।
আপনি যদি ক্রিপ্টোগ্রাফি ইঞ্জিনিয়ারিংয়ে হাত চেষ্টা করতে চান তবে পড়ুন।
প্রথমত, অচিহ্নযুক্ত এনক্রিপশন এবং ক্রিপ্টোগ্রাফিক ডুম নীতিমালার বিপদগুলি শিখতে আপনার সময় নেওয়া উচিত ।
- এনক্রিপ্ট করা ডেটা এখনও দূষিত ব্যবহারকারীর দ্বারা টেম্পার করতে পারে।
- এনক্রিপ্ট করা ডেটা প্রমাণীকরণ হস্তক্ষেপে বাধা দেয়।
- এনক্রিপ্ট করা ডেটা প্রমাণীকরণ, হস্তক্ষেপ রোধ করে না।
এনক্রিপশন এবং ডিক্রিপশন
পিএইচপি-তে এনক্রিপশন আসলে সহজ (আমরা ব্যবহার করতে যাচ্ছি openssl_encrypt()
এবং openssl_decrypt()
একবার আপনি কীভাবে আপনার তথ্য এনক্রিপ্ট করবেন সে সম্পর্কে কিছু সিদ্ধান্ত নিয়েছেন your openssl_get_cipher_methods()
আপনার সিস্টেমে সমর্থিত পদ্ধতির তালিকার জন্য পরামর্শ নিন C সিটিআর মোডে সেরা পছন্দটি হচ্ছে এইএস :
aes-128-ctr
aes-192-ctr
aes-256-ctr
বর্তমানে এটির কোনও কারণ নেই যে এইএস কী আকারটি উদ্বিগ্ন হওয়ার জন্য একটি তাত্পর্যপূর্ণ সমস্যা ( 256-বিট মোডে খারাপ কী-শিডিয়ুলিংয়ের কারণে বড় সম্ভবত সম্ভবত এটি ভাল নয় )।
দ্রষ্টব্য: আমরা mcrypt
এটি ব্যবহার করছি না কারণ এটি পরিত্যক্ত ওয়ার্ল্ড এবং আনপ্যাচড বাগ রয়েছে যা সুরক্ষা-প্রভাবিত করতে পারে। এই কারণগুলির কারণে, আমি অন্যান্য পিএইচপি বিকাশকারীদের এটি এড়াতেও উত্সাহিত করি।
ওপেনএসএসএল ব্যবহার করে সাধারণ এনক্রিপশন / ডিক্রিপশন র্যাপার
class UnsafeCrypto
{
const METHOD = 'aes-256-ctr';
/**
* Encrypts (but does not authenticate) a message
*
* @param string $message - plaintext message
* @param string $key - encryption key (raw binary expected)
* @param boolean $encode - set to TRUE to return a base64-encoded
* @return string (raw binary)
*/
public static function encrypt($message, $key, $encode = false)
{
$nonceSize = openssl_cipher_iv_length(self::METHOD);
$nonce = openssl_random_pseudo_bytes($nonceSize);
$ciphertext = openssl_encrypt(
$message,
self::METHOD,
$key,
OPENSSL_RAW_DATA,
$nonce
);
// Now let's pack the IV and the ciphertext together
// Naively, we can just concatenate
if ($encode) {
return base64_encode($nonce.$ciphertext);
}
return $nonce.$ciphertext;
}
/**
* Decrypts (but does not verify) a message
*
* @param string $message - ciphertext message
* @param string $key - encryption key (raw binary expected)
* @param boolean $encoded - are we expecting an encoded string?
* @return string
*/
public static function decrypt($message, $key, $encoded = false)
{
if ($encoded) {
$message = base64_decode($message, true);
if ($message === false) {
throw new Exception('Encryption failure');
}
}
$nonceSize = openssl_cipher_iv_length(self::METHOD);
$nonce = mb_substr($message, 0, $nonceSize, '8bit');
$ciphertext = mb_substr($message, $nonceSize, null, '8bit');
$plaintext = openssl_decrypt(
$ciphertext,
self::METHOD,
$key,
OPENSSL_RAW_DATA,
$nonce
);
return $plaintext;
}
}
ব্যবহারের উদাহরণ
$message = 'Ready your ammunition; we attack at dawn.';
$key = hex2bin('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f');
$encrypted = UnsafeCrypto::encrypt($message, $key);
$decrypted = UnsafeCrypto::decrypt($encrypted, $key);
var_dump($encrypted, $decrypted);
ডেমো : https://3v4l.org/jl7qR
উপরের সাধারণ ক্রিপ্টো লাইব্রেরিটি এখনও ব্যবহার করা নিরাপদ নয়। আমাদের ডিক্রিপ্ট করার আগে আমাদের সিফেরটেক্সটগুলি প্রমাণীকরণ করতে হবে এবং সেগুলি যাচাই করতে হবে ।
দ্রষ্টব্য : ডিফল্টরূপে, UnsafeCrypto::encrypt()
একটি কাঁচা বাইনারি স্ট্রিং ফিরে আসবে। আপনার যদি এটি বাইনারি-নিরাপদ বিন্যাসে (বেস 64-এনকোডড) সংরক্ষণ করতে হয় তবে এটিকে কল করুন:
$message = 'Ready your ammunition; we attack at dawn.';
$key = hex2bin('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f');
$encrypted = UnsafeCrypto::encrypt($message, $key, true);
$decrypted = UnsafeCrypto::decrypt($encrypted, $key, true);
var_dump($encrypted, $decrypted);
ডেমো : http://3v4l.org/f5K93
সাধারণ প্রমাণীকরণের আবরণ
class SaferCrypto extends UnsafeCrypto
{
const HASH_ALGO = 'sha256';
/**
* Encrypts then MACs a message
*
* @param string $message - plaintext message
* @param string $key - encryption key (raw binary expected)
* @param boolean $encode - set to TRUE to return a base64-encoded string
* @return string (raw binary)
*/
public static function encrypt($message, $key, $encode = false)
{
list($encKey, $authKey) = self::splitKeys($key);
// Pass to UnsafeCrypto::encrypt
$ciphertext = parent::encrypt($message, $encKey);
// Calculate a MAC of the IV and ciphertext
$mac = hash_hmac(self::HASH_ALGO, $ciphertext, $authKey, true);
if ($encode) {
return base64_encode($mac.$ciphertext);
}
// Prepend MAC to the ciphertext and return to caller
return $mac.$ciphertext;
}
/**
* Decrypts a message (after verifying integrity)
*
* @param string $message - ciphertext message
* @param string $key - encryption key (raw binary expected)
* @param boolean $encoded - are we expecting an encoded string?
* @return string (raw binary)
*/
public static function decrypt($message, $key, $encoded = false)
{
list($encKey, $authKey) = self::splitKeys($key);
if ($encoded) {
$message = base64_decode($message, true);
if ($message === false) {
throw new Exception('Encryption failure');
}
}
// Hash Size -- in case HASH_ALGO is changed
$hs = mb_strlen(hash(self::HASH_ALGO, '', true), '8bit');
$mac = mb_substr($message, 0, $hs, '8bit');
$ciphertext = mb_substr($message, $hs, null, '8bit');
$calculated = hash_hmac(
self::HASH_ALGO,
$ciphertext,
$authKey,
true
);
if (!self::hashEquals($mac, $calculated)) {
throw new Exception('Encryption failure');
}
// Pass to UnsafeCrypto::decrypt
$plaintext = parent::decrypt($ciphertext, $encKey);
return $plaintext;
}
/**
* Splits a key into two separate keys; one for encryption
* and the other for authenticaiton
*
* @param string $masterKey (raw binary)
* @return array (two raw binary strings)
*/
protected static function splitKeys($masterKey)
{
// You really want to implement HKDF here instead!
return [
hash_hmac(self::HASH_ALGO, 'ENCRYPTION', $masterKey, true),
hash_hmac(self::HASH_ALGO, 'AUTHENTICATION', $masterKey, true)
];
}
/**
* Compare two strings without leaking timing information
*
* @param string $a
* @param string $b
* @ref https://paragonie.com/b/WS1DLx6BnpsdaVQW
* @return boolean
*/
protected static function hashEquals($a, $b)
{
if (function_exists('hash_equals')) {
return hash_equals($a, $b);
}
$nonce = openssl_random_pseudo_bytes(32);
return hash_hmac(self::HASH_ALGO, $a, $nonce) === hash_hmac(self::HASH_ALGO, $b, $nonce);
}
}
ব্যবহারের উদাহরণ
$message = 'Ready your ammunition; we attack at dawn.';
$key = hex2bin('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f');
$encrypted = SaferCrypto::encrypt($message, $key);
$decrypted = SaferCrypto::decrypt($encrypted, $key);
var_dump($encrypted, $decrypted);
ডেমোস : কাঁচা বাইনারি , বেস 64-এনকোড
যদি কেউ এই SaferCrypto
লাইব্রেরিটিকে উত্পাদন পরিবেশে বা একই ধারণাগুলির নিজস্ব প্রয়োগে ব্যবহার করতে চান তবে আমি দৃ strongly ়রূপে আপনার বাসিন্দা ক্রিপ্টোগ্রাফারের কাছে দ্বিতীয় মতামতের জন্য পৌঁছে দেওয়ার পরামর্শ দিই recommend তারা আপনাকে এমন ভুল সম্পর্কে বলতে সক্ষম করবে যা আমি হয়ত অবগত নই।
আপনি একটি নামী ক্রিপ্টোগ্রাফি লাইব্রেরি ব্যবহার করে অনেক ভাল হবে ।