এমক্রিপ্ট হ্রাস করা হয়, বিকল্প কি?


103

Mcrypt-এক্সটেনশান অবচিত মন্তব্য পোস্ট অনুযায়ী পিএইচপি 7.2 সরানো হবে এখানে । সুতরাং আমি পাসওয়ার্ডগুলি এনক্রিপ্ট করার বিকল্প উপায় খুঁজছি।

এখনই আমি এরকম কিছু ব্যবহার করছি

mcrypt_encrypt(MCRYPT_RIJNDAEL_128, md5($key, true), $string, MCRYPT_MODE_CBC, $iv)

পাসওয়ার্ডগুলি এনক্রিপ্ট করার সবচেয়ে ভাল / শক্তিশালী উপায়ে আপনার মতামত আমার দরকার, এনক্রিপ্ট করা পাসওয়ার্ড অবশ্যই পিএইচপি 7..১০ এক্সএক্সএক্স দ্বারা সমর্থিত হওয়া উচিত এবং এটি ডিক্রিপ্টেবলও হওয়া উচিত কারণ আমার গ্রাহকরা কোনও নতুন উত্পন্ন না করেই তাদের পাসওয়ার্ডগুলি 'পুনরুদ্ধার' করার বিকল্প নিতে চান এক.


9
আপনার পাসওয়ার্ডগুলি এনক্রিপ্ট / ডিক্রিপ্ট করার দরকার কী? কেন কেবল তাদের সাথে হ্যাশ password_hashএবং তাদের সাথে যাচাই করা হচ্ছে না password_verify?
হবেন না

3
"এনক্রিপ্ট করা পাসওয়ার্ডও ডিক্রিপ্টযোগ্য হতে হবে" - কেন? খুব নিরাপদ শোনায় না। কোন বিশেষ কারণ?
ফানকি চল্লিশ নিনার

24
"কারণ আমার গ্রাহকরা একটি নতুন উত্পন্ন না করেই তাদের পাসওয়ার্ডগুলি 'পুনরুদ্ধার' করতে চান option" - এটি নিরাপদ নয় এবং পরিবর্তে তাদের পাসওয়ার্ডগুলি পুনরায় সেট করার জন্য তাদের বিকল্প দেওয়া উচিত।
ফানকি চল্লিশ নিনার

4
পাসওয়ার্ডগুলি এনক্রিপ্ট করবেন না , যখন আক্রমণকারী ডিবি পায় তখন সে এনক্রিপশন কীটিও পেয়ে যাবে। প্রায় 100 মিমি সময়কালের জন্য এলোমেলো লবণের সাথে একটি এইচএমএসি ওপরে আইট্রেট করুন এবং হ্যাশ দিয়ে লবণ সংরক্ষণ করুন। পাসওয়ার্ড_হ্যাশ, PBKDF2, Bcrypt এবং অনুরূপ ফাংশন হিসাবে ফাংশন ব্যবহার করুন। মোদ্দা কথাটি হ'ল আক্রমণকারী হিংস্র বলের দ্বারা পাসওয়ার্ড খুঁজতে অনেক সময় ব্যয় করে।
জাফ

2
পিএইচপি ম্যানুয়াল থেকে -> এই ফাংশনটি পিএইচপি 7.1.0 হিসাবে অবহিত করা হয়েছে। এই ফাংশন উপর নির্ভর করা অত্যন্ত নিরুৎসাহিত করা হয়। বিকল্প হ'ল সোডিয়াম -> php.net/manual/en/book.sodium.php
মার্কোজেেন

উত্তর:


47

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

আপনার যদি অবশ্যই আপনার ডেটা এনক্রিপ্ট করে এবং এটি ডিক্রিপ্টযোগ্য হয় তবে নিরাপদ এনক্রিপশন / ডিক্রিপশন করার জন্য একটি গাইড https://paragonie.com/white-paper/2015-secure-php-data-encryption এ উপলব্ধ । এই লিঙ্কটি সংক্ষেপে:

  • লিবসোডিয়াম ব্যবহার করুন - একটি পিএইচপি এক্সটেনশন
  • আপনি যদি লিবসোডিয়াম ব্যবহার করতে না পারেন তবে ডিফিউজ / পিএইচপি-এনক্রিপশন - সোজা পিএইচপি কোড ব্যবহার করুন
  • আপনি যদি লিবসোডিয়াম ব্যবহার করতে না পারেন বা / php-এনক্রিপশনকে ডিফল্ট করতে না পারেন তবে ওপেনএসএসএল ব্যবহার করুন - প্রচুর সার্ভার ইতিমধ্যে এটি ইনস্টলড থাকবে। যদি তা না হয় তবে এটি - ওপেনসেল সহ [= ডিআইআর] দিয়ে সংকলন করা যায়

1
প্রথমে ওপেনসেল চেষ্টা করা উচিত কারণ এটি খুব সাধারণ, যেখানে লিবসডিয়াম নেই। প্রশ্ন থাকলে সমস্ত নেটিভ এক্সটেনশান না হয়ে থাকলে কাঁচা পিএইচপি ব্যবহার করা উচিত নয়
JSON

যদিও OpenSSL খুবই সাধারণ, এটা যে পিএইচপি 7 এর মূলে ক্রিপ্টোগ্রাফি জন্য libsodium ব্যবহার করা হবে বলে মনে হয় securityintelligence.com/news/...
দয়া

1
মনে রাখবেন এখানে একটি লাইব্রেরি রয়েছে Sodium-compat( github.com/paragonie/sodium_compat ) যা পিএইচপি> = 5.2.4 এ কাজ করে
রায়েলবি

30

@RqLizard দ্বারা প্রস্তাবিত হিসাবে , আপনি পরিবর্তে openssl_encrypt/ openssl_decryptপিএইচপি ফাংশন ব্যবহার করতে পারেন যা এইএস (অ্যাডভান্সড এনক্রিপশন স্ট্যান্ডার্ড) বাস্তবায়নের জন্য আরও ভাল বিকল্প সরবরাহ করে যা রিজান্ডেল এনক্রিপশন হিসাবে পরিচিত।

পিএইচপিএনএমে নিম্নলিখিত স্কটের মন্তব্য অনুসারে :

যদি আপনি 2015 এ ডেটা এনক্রিপ্ট / এনক্রিপ্ট করার কোড লিখছেন, আপনার ব্যবহার করা উচিত openssl_encrypt()এবং openssl_decrypt()। অন্তর্নিহিত লাইব্রেরি ( libmcrypt) 2007 থেকে পরিত্যাজ্য করা হয়েছে, এবং ওপেনএসএসএল (যা বেনিফিট করে) এর চেয়ে অনেক খারাপ কাজ করেAES-NI আধুনিক প্রসেসরের উপর করে এবং ক্যাশে-সময় নিরাপদ) এর

এছাড়াও, MCRYPT_RIJNDAEL_256এটি নয় AES-256, এটি রিজান্ডেল ব্লক সাইফারের একটি পৃথক রূপ। আপনি যদি চান AES-256যে mcrypt, আপনি ব্যবহার করতে হবে MCRYPT_RIJNDAEL_12832-বাইট কী দিয়ে। ওপেনএসএসএল এটি আরও স্পষ্ট করে তোলে আপনি কোন মোডটি ব্যবহার করছেন (যেমন aes-128-cbcবনাম aes-256-ctr)।

ওপেনএসএসএল এমক্রিপ্টের নুল বাইট প্যাডিংয়ের পরিবর্তে সিবিসি মোডের সাথে পিকেসিএস 7 প্যাডিংও ব্যবহার করে। সুতরাং, এমক্রিপ্ট আপনার কোড ওপেনএসএসএল-এর তুলনায় প্যাডিং ওরাকল আক্রমণগুলিতে ঝুঁকিপূর্ণ হওয়ার সম্ভাবনা বেশি।

অবশেষে, আপনি যদি নিজের সিফেরটেক্সটগুলি (এনক্রিপ্ট তারপর ম্যাক) প্রমাণীকরণ করেন না, আপনি এটি ভুল করছেন।

আরও পড়া:

কোড উদাহরণ

উদাহরণ # 1

পিইচপি 7.1+ এর জন্য জিসিএম মোডে এইএস প্রমাণীকৃত এনক্রিপশন

<?php
//$key should have been previously generated in a cryptographically safe way, like openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$cipher = "aes-128-gcm";
if (in_array($cipher, openssl_get_cipher_methods()))
{
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
    //store $cipher, $iv, and $tag for decryption later
    $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
    echo $original_plaintext."\n";
}
?>

উদাহরণ # 2

পিএইচপি 5.6+ এর জন্য এইএস প্রমাণীকৃত এনক্রিপশন উদাহরণ

<?php
//$key previously generated safely, ie: openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );

//decrypt later....
$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
if (hash_equals($hmac, $calcmac))//PHP 5.6+ timing attack safe comparison
{
    echo $original_plaintext."\n";
}
?>

উদাহরণ # 3

উপরের উদাহরণগুলির উপর ভিত্তি করে, আমি নিম্নলিখিত কোডটি পরিবর্তন করেছি যা ব্যবহারকারীর সেশন আইডি এনক্রিপ্ট করার লক্ষ্য:

class Session {

  /**
   * Encrypts the session ID and returns it as a base 64 encoded string.
   *
   * @param $session_id
   * @return string
   */
  public function encrypt($session_id) {
    // Get the MD5 hash salt as a key.
    $key = $this->_getSalt();
    // For an easy iv, MD5 the salt again.
    $iv = $this->_getIv();
    // Encrypt the session ID.
    $encrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $session_id, MCRYPT_MODE_CBC, $iv);
    // Base 64 encode the encrypted session ID.
    $encryptedSessionId = base64_encode($encrypt);
    // Return it.
    return $encryptedSessionId;
  }

  /**
   * Decrypts a base 64 encoded encrypted session ID back to its original form.
   *
   * @param $encryptedSessionId
   * @return string
   */
  public function decrypt($encryptedSessionId) {
    // Get the MD5 hash salt as a key.
    $key = $this->_getSalt();
    // For an easy iv, MD5 the salt again.
    $iv = $this->_getIv();
    // Decode the encrypted session ID from base 64.
    $decoded = base64_decode($encryptedSessionId);
    // Decrypt the string.
    $decryptedSessionId = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $decoded, MCRYPT_MODE_CBC, $iv);
    // Trim the whitespace from the end.
    $session_id = rtrim($decryptedSessionId, "\0");
    // Return it.
    return $session_id;
  }

  public function _getIv() {
    return md5($this->_getSalt());
  }

  public function _getSalt() {
    return md5($this->drupal->drupalGetHashSalt());
  }

}

মধ্যে:

class Session {

  const SESS_CIPHER = 'aes-128-cbc';

  /**
   * Encrypts the session ID and returns it as a base 64 encoded string.
   *
   * @param $session_id
   * @return string
   */
  public function encrypt($session_id) {
    // Get the MD5 hash salt as a key.
    $key = $this->_getSalt();
    // For an easy iv, MD5 the salt again.
    $iv = $this->_getIv();
    // Encrypt the session ID.
    $ciphertext = openssl_encrypt($session_id, self::SESS_CIPHER, $key, $options=OPENSSL_RAW_DATA, $iv);
    // Base 64 encode the encrypted session ID.
    $encryptedSessionId = base64_encode($ciphertext);
    // Return it.
    return $encryptedSessionId;
  }

  /**
   * Decrypts a base 64 encoded encrypted session ID back to its original form.
   *
   * @param $encryptedSessionId
   * @return string
   */
  public function decrypt($encryptedSessionId) {
    // Get the Drupal hash salt as a key.
    $key = $this->_getSalt();
    // Get the iv.
    $iv = $this->_getIv();
    // Decode the encrypted session ID from base 64.
    $decoded = base64_decode($encryptedSessionId, TRUE);
    // Decrypt the string.
    $decryptedSessionId = openssl_decrypt($decoded, self::SESS_CIPHER, $key, $options=OPENSSL_RAW_DATA, $iv);
    // Trim the whitespace from the end.
    $session_id = rtrim($decryptedSessionId, '\0');
    // Return it.
    return $session_id;
  }

  public function _getIv() {
    $ivlen = openssl_cipher_iv_length(self::SESS_CIPHER);
    return substr(md5($this->_getSalt()), 0, $ivlen);
  }

  public function _getSalt() {
    return $this->drupal->drupalGetHashSalt();
  }

}

স্পষ্ট করতে, উপরের পরিবর্তনটি সত্য রূপান্তর নয় কারণ দুটি এনক্রিপশন একটি পৃথক ব্লকের আকার এবং আলাদা এনক্রিপ্ট করা ডেটা ব্যবহার করে। অতিরিক্তভাবে, ডিফল্ট প্যাডিং পৃথক, MCRYPT_RIJNDAELকেবল অ-মানক নাল প্যাডিং সমর্থন করে। @zaph


অতিরিক্ত নোট (@ জাফের মন্তব্য থেকে):

  • Rijndael 128 ( MCRYPT_RIJNDAEL_128) হল সমতূল্য হবে AES তবে Rijndael 256 ( MCRYPT_RIJNDAEL_256) নয় AES-256 256 নির্দিষ্ট করে 256-বিট একটি ব্লক আকার, যেহেতু হবে AES 128-বিট: শুধুমাত্র এক ব্লক আকার হয়েছে। সুতরাং মূলত 256-বিট ( MCRYPT_RIJNDAEL_256) এর একটি ব্লক আকারের রিজান্ডেলকে এমক্রিপ ডেভেলপারদের পছন্দগুলির কারণে ভুল করে নামকরণ করা হয়েছে । @zaph
  • 258 -র একটি ব্লকের আকারের রিজান্ডেল 128-বিটের ব্লকের আকারের চেয়ে কম সুরক্ষিত হতে পারে কারণ পরেরটির অনেক বেশি পর্যালোচনা এবং ব্যবহার রয়েছে। দ্বিতীয়ত, আন্তঃব্যবহার্যতা এতে বাধা দেয় যখন এইএস সাধারণত পাওয়া যায়, যেখানে 256-বিটের ব্লকের আকারের রিজান্ডেল নেই not
  • রিজান্ডেলের জন্য বিভিন্ন ব্লক আকারের সাথে এনক্রিপশন বিভিন্ন এনক্রিপ্টড ডেটা তৈরি করে।

    উদাহরণস্বরূপ, MCRYPT_RIJNDAEL_256(সমতুল্য নয় AES-256) 256-বিট আকারের রিজান্ডেল ব্লক সাইফারের আলাদা বৈকল্পিক এবং কী পাস করা উপর ভিত্তি করে একটি কী আকারকে সংজ্ঞায়িত করে, যেখানে aes-256-cbcকি-র আকারের 128-বিটের একটি ব্লক আকারের সাথে রিজান্ডেল রয়েছে 256-বিট। সুতরাং তারা বিভিন্ন ব্লক আকার ব্যবহার করছে যা পুরোপুরি আলাদা এনক্রিপ্ট করা ডেটা তৈরি করে এমক্রিপ্ট ব্লকের আকার নির্দিষ্ট করতে নম্বরটি ব্যবহার করে, যেখানে ওপেনএসএসএল কী আকারটি নির্দিষ্ট করার জন্য নম্বরটি ব্যবহার করেছে (এইএসের কেবল একটি ব্লকের আকার 128-বিট রয়েছে)। সুতরাং মূলত এইএস হ'ল রিজান্ডেল 128-বিট এবং 128, 192 এবং 256 বিটের কী আকারের ব্লক আকারের। সুতরাং ওপেনএসএসএলে রিজান্ডেল 128 নামে পরিচিত এটিএস ব্যবহার করা আরও ভাল।


1
এমক্রিপ্ট বিকাশকারীদের পছন্দগুলির কারণে 256-বিটের ব্লকের আকারের সাথে রিজান্ডেল ব্যবহার করা একটি ভুল। 256-এর একটি ব্লকের আকারের সাথে রিজান্ডেল কম সুরক্ষিত হতে পারে যা 128-বিটের ব্লকের আকারের সাথে থাকে কারণ পরবর্তীটির অনেক বেশি পর্যালোচনা এবং ব্যবহার ছিল। অতিরিক্তভাবে আন্তঃব্যবযোগিতা বাধাগ্রস্ত হয় যখন AES সাধারণত 256-বিটের ব্লকের আকারের সাথে রিজান্ডেল পাওয়া যায় না।
zaph

আপনি কেন $session_id = rtrim($decryptedSessionId, "\0");? openssl_decryptশেষ পর্যন্ত কিছু অযাচিত চরিত্রগুলি ফিরিয়ে দেওয়া কি সম্ভব ? এনক্রিপ্টড ভেরিয়েবলটি 0 (যেমন encrypt("abc0")?
hlscalon

@hiscalon "\0"নয় "0"কিন্তু শূন্য অক্ষর, যার ASCII কোড 0x00 (হেক্সাডেসিমেল 0) হয়।
কিমলালুনো

11

রিজনডেলের খাঁটি-পিএইচপি বাস্তবায়ন পিএইচপিএসক্লিবের সাথে সুরকার প্যাকেজ হিসাবে উপলব্ধ এবং পিএইচপি 7.3 এ কাজ করে (আমার দ্বারা পরীক্ষিত)।

Phpseclib ডক্সে একটি পৃষ্ঠা রয়েছে, যা আপনি বেসিক ভেরিয়েবলগুলি (সিফার, মোড, কী আকার, বিট আকার) ইনপুট করার পরে নমুনা কোড উত্পন্ন করে । এটি রিজান্ডেল, ইসিবি, 256, 256 এর জন্য নিম্নলিখিত ফলাফলগুলি প্রকাশ করে:

মাইক্রিপ্ট সহ একটি কোড

$decoded = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, ENCRYPT_KEY, $term, MCRYPT_MODE_ECB);

লাইব্রেরির সাথে এটির মতো কাজ করে

$rijndael = new \phpseclib\Crypt\Rijndael(\phpseclib\Crypt\Rijndael::MODE_ECB);
$rijndael->setKey(ENCRYPT_KEY);
$rijndael->setKeyLength(256);
$rijndael->disablePadding();
$rijndael->setBlockLength(256);

$decoded = $rijndael->decrypt($term);

* $termছিলbase64_decoded


11

এখানে অন্যান্য উত্তরের হিসাবে বিশদ হিসাবে, আমি যে সেরা সমাধানটি পেয়েছি তা হ'ল ওপেনএসএসএল ব্যবহার করা। এটি পিএইচপিতে অন্তর্নির্মিত এবং আপনার কোনও বাহ্যিক গ্রন্থাগারের প্রয়োজন নেই। এখানে সাধারণ উদাহরণ রয়েছে:

এনক্রিপ্ট করতে:

function encrypt($key, $payload) {
  $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
  $encrypted = openssl_encrypt($payload, 'aes-256-cbc', $key, 0, $iv);
  return base64_encode($encrypted . '::' . $iv);
}

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

function decrypt($key, $garble) {
    list($encrypted_data, $iv) = explode('::', base64_decode($garble), 2);
    return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
}

রেফারেন্স লিংক: https://www.shift8web.ca/2017/04/how-to-encrypt-and-execute-your-php-code-with-mcrypt/


বন্ধুকে অনেক অনেক ভাল কর্ম! একটি জিনিস: উদাহরণস্বরূপ, পাসওয়ার্ডটি যদি পুরানো কোড সহ এনক্রিপ্ট করা থাকে তবে নতুন ডিক্রিপ্ট কোডটি এটি যাচাই করতে সক্ষম হবে না। এটি নতুন কোড সহ পুনরায় সংরক্ষণ এবং এনক্রিপ্ট করতে হবে।
লুমিস 21

একটি সরল মাইগ্রেশন স্ক্রিপ্ট এই সমস্যাটি সমাধান করবে। ডিক্রিপ্ট করার পুরানো উপায়টি ব্যবহার করুন তারপরে এনক্রিপ্ট এবং সঞ্চয় করার নতুন উপায়। বিকল্পটি ব্যবহারকারীর টেবিলে একটি পতাকা যুক্ত করছে এবং পাসওয়ার্ড পরিবর্তনের প্রয়োজন এমন সমস্ত ব্যবহারকারীর অ্যাকাউন্টে বাধ্য হয়ে পাসওয়ার্ড পুনরায় সেট করতে স্ক্রিপ্টিং করছে।
সিসিল মেরেল ওরফে ফিরিয়েইন ফায়ার

8

তুমি ব্যবহার করতে পার phpseclib পলিফিল প্যাকেজ । আপনি রিজান্ডেল 256 সহ এনক্রিপ্ট / ডিক্রিপ্টের জন্য ওপেন এসএসএল বা লিবসোডিয়াম ব্যবহার করতে পারবেন না Another অন্য সমস্যা, আপনার কোনও কোড প্রতিস্থাপনের দরকার নেই।


2
এটি অত্যন্ত সহায়ক ধন্যবাদ ছিল। পিএইচপি-এমক্রিপট এক্সটেনশনটি সরিয়ে ফেলতে হয়েছিল এবং তারপরে এটি একটি কবজির মতো কাজ করে।
ড্যানিবি

আমি mcrypt_compatচালিয়ে ইনস্টল করেছি composer require phpseclib/mcrypt_compatতবে আমি এখনও PHP Fatal error: Uncaught Error: Call to undefined function mcrypt_get_key_size() in /app/kohana/classes/Kohana/Encrypt.php:124পিএইচপি 7.2.26এবং কোহানা ফ্রেমওয়ার্ক ব্যবহার করছি । এটি সুরকারের সাথে ইনস্টল করার পরে আরও কিছু পদক্ষেপ রয়েছে?
এম-ডাহাব

বুঝেছি. আপনি require APPPATH . '/vendor/autoload.php';নীচে যোগ করতে হবে bootstrap.php
এম-ডাহাব

3

mcryptএটি ওপেনএসএসএল হিসাবে সক্রিয়ভাবে বিকাশিত এবং রক্ষণাবেক্ষণ করা উচিত। এটি আরও ভাল সুরক্ষা, রক্ষণাবেক্ষণযোগ্যতা এবং বহনযোগ্যতা সরবরাহ করে। দ্বিতীয়ত এটি AES এনক্রিপশন / ডিক্রিপশন অনেক দ্রুত সম্পাদন করে। এটি ডিফল্টরূপে পিকেসিএস 7 প্যাডিং ব্যবহার করে OPENSSL_ZERO_PADDINGতবে আপনার প্রয়োজন হলে আপনি তা নির্দিষ্ট করে দিতে পারেন। একটি 32-বাইট বাইনারি কী ব্যবহার করার জন্য, আপনি aes-256-cbcকোনটি থেকে বেশি সুস্পষ্ট তা নির্দিষ্ট করতে পারেনMCRYPT_RIJNDAEL_128

ম্যাক্রিপ্ট ব্যবহার করে এখানে কোডের উদাহরণ দেওয়া হল:

পিকেসিএস 7 প্যাডিং সহ ম্যাক্রিপ্টে লিখিত অননুমোদিত AES-256-CBC এনক্রিপশন লাইব্রেরি।

/**
 * This library is unsafe because it does not MAC after encrypting
 */
class UnsafeMcryptAES
{
    const CIPHER = MCRYPT_RIJNDAEL_128;

    public static function encrypt($message, $key)
    {
        if (mb_strlen($key, '8bit') !== 32) {
            throw new Exception("Needs a 256-bit key!");
        }
        $ivsize = mcrypt_get_iv_size(self::CIPHER);
        $iv = mcrypt_create_iv($ivsize, MCRYPT_DEV_URANDOM);

        // Add PKCS7 Padding
        $block = mcrypt_get_block_size(self::CIPHER);
        $pad = $block - (mb_strlen($message, '8bit') % $block, '8bit');
        $message .= str_repeat(chr($pad), $pad);

        $ciphertext = mcrypt_encrypt(
            MCRYPT_RIJNDAEL_128,
            $key,
            $message,
            MCRYPT_MODE_CBC,
            $iv
        );

        return $iv . $ciphertext;
    }

    public static function decrypt($message, $key)
    {
        if (mb_strlen($key, '8bit') !== 32) {
            throw new Exception("Needs a 256-bit key!");
        }
        $ivsize = mcrypt_get_iv_size(self::CIPHER);
        $iv = mb_substr($message, 0, $ivsize, '8bit');
        $ciphertext = mb_substr($message, $ivsize, null, '8bit');

        $plaintext = mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128,
            $key,
            $ciphertext,
            MCRYPT_MODE_CBC,
            $iv
        );

        $len = mb_strlen($plaintext, '8bit');
        $pad = ord($plaintext[$len - 1]);
        if ($pad <= 0 || $pad > $block) {
            // Padding error!
            return false;
        }
        return mb_substr($plaintext, 0, $len - $pad, '8bit');
    }
}

এবং এখানে ওপেনএসএসএল ব্যবহার করে লিখিত সংস্করণটি রয়েছে:

/**
 * This library is unsafe because it does not MAC after encrypting
 */
class UnsafeOpensslAES
{
    const METHOD = 'aes-256-cbc';

    public static function encrypt($message, $key)
    {
        if (mb_strlen($key, '8bit') !== 32) {
            throw new Exception("Needs a 256-bit key!");
        }
        $ivsize = openssl_cipher_iv_length(self::METHOD);
        $iv = openssl_random_pseudo_bytes($ivsize);

        $ciphertext = openssl_encrypt(
            $message,
            self::METHOD,
            $key,
            OPENSSL_RAW_DATA,
            $iv
        );

        return $iv . $ciphertext;
    }

    public static function decrypt($message, $key)
    {
        if (mb_strlen($key, '8bit') !== 32) {
            throw new Exception("Needs a 256-bit key!");
        }
        $ivsize = openssl_cipher_iv_length(self::METHOD);
        $iv = mb_substr($message, 0, $ivsize, '8bit');
        $ciphertext = mb_substr($message, $ivsize, null, '8bit');

        return openssl_decrypt(
            $ciphertext,
            self::METHOD,
            $key,
            OPENSSL_RAW_DATA,
            $iv
        );
    }
}

উত্স: আপনি যদি আপনার পিএইচপি কোডটিতে MCRYPT শব্দটি টাইপ করে থাকেন তবে আপনি এটি ভুল করছেন


2

আমি এটি খুব দেরিতে পোস্ট করছি, তবে আমি আশা করি এটি পিএইচপি 7.2x সংস্করণে একই সমস্যার মুখোমুখি অন্য কাউকে সহায়তা করবে।

আমি এটি পিএইচপি 7.2x এ ব্যবহার করছি, এটি আমার জন্য কার্যকর।

public function make_hash($userStr){
        try{
            /** 
             * Used and tested on PHP 7.2x, Salt has been removed manually, it is now added by PHP 
             */
             return password_hash($userStr, PASSWORD_BCRYPT);
            }catch(Exception $exc){
                $this->tempVar = $exc->getMessage();
                return false;
            }
        }

এবং তারপরে নীচের ফাংশনটি দিয়ে হ্যাশটিকে প্রমাণীকরণ করুন:

public function varify_user($userStr,$hash){
        try{
            if (password_verify($userStr, $hash)) {
                 return true;
                }
            else {
                return false;
                }
            }catch(Exception $exc){
                $this->tempVar = $exc->getMessage();
                return false;
            }
        }

// উদাহরণ:

  //create hash from user string

 $user_password = $obj->make_hash2($user_key);

এবং এই হ্যাশটি প্রমাণীকরণ করতে নিম্নলিখিত কোডটি ব্যবহার করুন:

if($obj->varify_user($key, $user_key)){
      //this is correct, you can proceed with  
    }

এখানেই শেষ


1

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

পিএইচপি র্যান্ডম-সল্টড, ওয়ান-ওয়ে হ্যাশ এনক্রিপশন - password_hash()এবং এর জন্য এক জোড়া শক্তিশালী ফাংশন সরবরাহ করে password_verify()। হ্যাশ স্বয়ংক্রিয়ভাবে এলোমেলো-সল্টড হওয়ায় হ্যাকারদের পাসওয়ার্ডের বিপরীতে ইঞ্জিনিয়ার করার জন্য পাসওয়ার্ড হ্যাশগুলির পূর্বনির্ধারিত টেবিলগুলি ব্যবহার করার কোনও উপায় নেই। PASSWORD_DEFAULTবিকল্পটি সেট করুন এবং পিএইচপি-র ভবিষ্যতের সংস্করণগুলি আপনাকে নিজের কোড আপডেট না করে পাসওয়ার্ড হ্যাশগুলি তৈরি করতে স্বয়ংক্রিয়ভাবে শক্তিশালী অ্যালগরিদম ব্যবহার করবে।


1

আপনি openssl_encrypt()ফাংশন ব্যবহার করা উচিত ।


পিএইচপি 7 এর ওপেনসেল এনক্রিপ্টটিতে কি "হৃদয়যুক্ত" রয়েছে?
দ্য ক্র্যাজিপ্রোফেসর

13
কেন ওপেনটি ওপেনসেল_ইনক্রিপ্ট ব্যবহার করবে? কিছু বিশদ এবং পটভূমি দিন
মার্টিন

0

আমি আমার ক্রিপ্টো অবজেক্টটি অনুবাদ করতে সক্ষম হয়েছি

  • পুরানো ডেটা ডিক্রিপ্ট করার জন্য mcrypt সহ পিএইচপি-র একটি অনুলিপি পান। আমি http://php.net/get/php-7.1.12.tar.gz/from/a/mirror এ গিয়েছিলাম , এটি সংকলন করেছি, তারপরে ext / mcrypt এক্সটেনশন যুক্ত করেছি (কনফিগার করুন; মেক করুন; মেক ইনস্টল করুন)। আমার মনে হয় আমাকে php.ini তেও এক্সটেনশন = mcrypt.so লাইন যোগ করতে হয়েছিল। স্ক্রিপ্টগুলির একটি সিরিজ যা সমস্ত ডেটা আনইনক্রিপ্ট না করে ডেটার মধ্যবর্তী সংস্করণ তৈরি করে।

  • ওপেনসেলের জন্য একটি সরকারী এবং ব্যক্তিগত কী তৈরি করুন

    openssl genrsa -des3 -out pkey.pem 2048
    (set a password)
    openssl rsa -in pkey.pem -out pkey-pub.pem -outform PEM -pubout
  • এনক্রিপ্ট করতে (সর্বজনীন কী ব্যবহার করে) ওপেনস্ল_সিল ব্যবহার করুন। আমি যা পড়েছি তা থেকে, আরএসএ কী ব্যবহার করে ওপেনএসএল_ইনক্রিপট কী দৈর্ঘ্যের চেয়ে 11 বাইট কম সীমাবদ্ধ ( টমাস হর্স্টেনের http://php.net/manual/en/function.openssl-public-encrypt.php মন্তব্য দেখুন )

    $pubKey = openssl_get_publickey(file_get_contents('./pkey-pub.pem'));
    openssl_seal($pwd, $sealed, $ekeys, [ $pubKey ]);
    $encryptedPassword = base64_encode($sealed);
    $key = base64_encode($ekeys[0]);

আপনি সম্ভবত কাঁচা বাইনারি সঞ্চয় করতে পারে।

  • ডিক্রিপ্ট করতে (ব্যক্তিগত কী ব্যবহার করে)

    $passphrase="passphrase here";
    $privKey = openssl_get_privatekey(file_get_contents('./pkey.pem'), $passphrase);
    // I base64_decode() from my db columns
    openssl_open($encryptedPassword, $plain, $key, $privKey);
    echo "<h3>Password=$plain</h3>";

পিএস আপনি খালি স্ট্রিং ("") এনক্রিপ্ট করতে পারবেন না

পিপিএস এটি কোনও পাসওয়ার্ড ডাটাবেসের জন্য যা ব্যবহারকারীর বৈধতার জন্য নয়।

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