php حذف - تشفير ثنائي الاتجاه:أحتاج إلى تخزين كلمات المرور التي يمكن استردادها




كيفية المتصفحات (8)

كلمات المرور هي لجهاز ، لذلك التحقق ضد التجزئة غير وارد

إيه؟ أنا لا أفهم. هل تعني فقط أن كلمة المرور يجب أن تكون قابلة للاسترداد؟

كما قال الآخرون ، يوفر امتداد mcrypt إمكانية الوصول إلى الكثير من وظائف التشفير - على الرغم من ذلك ، فإنك تدعوا المستخدمين لديك لوضع كل بيضهم في سلة واحدة - واحدة من المحتمل أن تكون هدفا للمهاجمين - وإذا كنت لا تعرف حتى كيفية البدء في حل المشكلة فأنت تفعل مستخدما خدمة. لست في وضع يسمح لك بفهم كيفية حماية البيانات.

لا تأتي معظم الثغرات الأمنية بسبب أن الخوارزمية الأساسية معيبة أو غير آمنة - ولكن بسبب مشاكل في طريقة استخدام الخوارزمية في شفرة التطبيق.

بعد قولي هذا ، من الممكن بناء نظام آمن إلى حد معقول.

يجب عليك فقط التفكير في التشفير غير المتماثل إذا كان لديك متطلب لمستخدم لإنشاء رسالة آمنة يمكن قراءتها بواسطة مستخدم آخر (محدد). والسبب هو أن لها حسابية مكلفة. إذا كنت تريد فقط توفير مستودع للمستخدمين لإدخال واسترداد البيانات الخاصة بهم ، يكون التشفير المتناظر كافياً.

ومع ذلك ، إذا قمت بتخزين المفتاح لفك تشفير الرسالة في نفس المكان مثل الرسالة المشفرة (أو حيث يتم تخزين الرسالة المشفرة) فإن النظام غير آمن. استخدم نفس الرمز المميز لمصادقة المستخدم بالنسبة لمفتاح فك التشفير (أو في حالة التشفير التحليلي ، استخدم الرمز المميز ككلمة مرور مفتاح خاص). نظرًا لأنك ستحتاج إلى تخزين الرمز المميز على الخادم حيث يحدث فك التشفير مؤقتًا على الأقل ، قد ترغب في استخدام طبقة تخزين غير قابلة للبحث في جلسة العمل ، أو تمرير الرمز المميز مباشرة إلى خادم مرتبط بالجلسة التي تخزن رمز في الذاكرة وتنفيذ فك التشفير من الرسائل على الطلب.

أقوم بإنشاء تطبيق يقوم بتخزين كلمات المرور ، والتي يمكن للمستخدم استردادها ومشاهدتها. كلمات المرور هي لجهاز ، لذلك التحقق ضد التجزئة غير وارد.

ما أحتاج إلى معرفته هو:

  1. كيف أقوم بتشفير وفك تشفير كلمة المرور في PHP؟

  2. ما هي خوارزمية الأكثر أمانًا لتشفير كلمات المرور؟

  3. أين يمكنني تخزين المفتاح الخاص؟

  4. بدلاً من تخزين المفتاح الخاص ، هل من الجيد مطالبة المستخدمين بإدخال المفتاح الخاص في أي وقت يحتاجون فيه إلى فك تشفير كلمة المرور؟ (يمكن الوثوق بمستخدمي هذا التطبيق)

  5. بأي طرق يمكن سرقة كلمة المرور وفك تشفيرها؟ ما الذي يجب أن أكون على علم به؟


لقد جربت شيئًا من هذا القبيل ولكن يرجى ملاحظة أنني لست مشفّرًا ولا أحتفظ بمعرفة متعمقة حول php أو أي لغة برمجة. انها مجرد فكرة. فكرتي هي تخزين key في بعض الملفات أو database (أو إدخالها يدويًا) والتي لا يمكن التنبؤ بسهولة (الموقع) (وبالطبع سيتم فك تشفير أي شيء يومًا ما ، والمفهوم هو إطالة وقت فك التشفير) وتشفير المعلومات الحساسة.

$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH , MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "evenifyouaccessmydatabaseyouwillneverfindmyemail";
$text = "[email protected]";
echo "Key : ".$key."<br/>";
echo "Text : ".$text . "<br/>";
echo "Md5 : ".md5($text). "<br/>";
echo "Sha1 : ".sha1($text). "<br/>";



$crypttext = mcrypt_encrypt(MCRYPT_BLOWFISH , $key, $text, MCRYPT_MODE_ECB, $iv);
echo "Crypted Data : ".$crypttext."<br>";

$base64 = base64_encode($crypttext);
echo "Encoded Data : ".$base64."<br/>";
$decode =  base64_decode($base64);


$decryptdata = mcrypt_decrypt(MCRYPT_BLOWFISH , $key, $crypttext, MCRYPT_MODE_ECB, $iv);

echo "Decoded Data : ".ereg_replace("?", null ,  $decryptdata); 
//event if i add '?' to the sting to the text it works, I don't know why.

يرجى ملاحظة أنه مجرد فكرة. سيكون أي تحسن على هذا الرمز موضع تقدير كبير.


كيف أقوم بتشفير وفك تشفير كلمة المرور في PHP؟ من خلال تنفيذ واحد من العديد من خوارزميات التشفير. (أو باستخدام واحدة من العديد من المكتبات)

ما هي خوارزمية الأكثر أمانًا لتشفير كلمات المرور؟ هناك أطنان من الخوارزميات المختلفة ، لا شيء منها آمن بنسبة 100٪. لكن العديد منها آمن بما يكفي لأغراض التجارة وحتى للأغراض العسكرية

أين يمكنني تخزين المفتاح الخاص؟ إذا قررت تنفيذ مفتاح عام - خوارزمية تشفير (مثل RSA) ، فأنت لا تخزن المفتاح الخاص. المستخدم لديك مفتاح خاص. يحتوي نظامك على مفتاح عام يمكن تخزينه في أي مكان ترغب فيه.

بدلاً من تخزين المفتاح الخاص ، هل من الجيد مطالبة المستخدمين بإدخال المفتاح الخاص في أي وقت يحتاجون فيه إلى فك تشفير كلمة المرور؟ (يمكن الوثوق بمستخدمي هذا التطبيق) حسناً إذا كان بإمكان المستخدم تذكر أرقام أولية طويلة بشكل يبعث على السخرية - نعم ، لم لا. لكن بشكل عام ، ستحتاج إلى التوصل إلى النظام الذي سيسمح للمستخدم بتخزين مفتاحه في مكان ما.

بأي طرق يمكن سرقة كلمة المرور وفك تشفيرها؟ ما الذي يجب أن أكون على علم به؟ هذا يعتمد على الخوارزمية المستخدمة. ومع ذلك تأكد دائمًا من عدم إرسال كلمة المرور غير مشفرة إلى أو من المستخدم. إما تشفير / فك تشفيرها على جانب العميل ، أو استخدام https (أو مستخدم آخر يعني التشفير لتأمين الاتصال بين الخادم والعميل).

ولكن إذا كان كل ما تحتاجه هو تخزين كلمات المرور بطريقة مشفرة ، فإنني أقترح عليك استخدام رمز XOR بسيط. المشكلة الرئيسية في هذه الخوارزمية هي أنه يمكن كسرها بسهولة عن طريق تحليل التردد. ومع ذلك ، لا يتم عادةً استخدام كلمات المرور من فقرات طويلة من النص الإنجليزي ، ولا أعتقد أنه يجب عليك القلق بشأنها. المشكلة الثانية مع XOR Cipher هي أنه إذا كان لديك رسالة في كل من النموذج المشفر وغير المشفر ، يمكنك بسهولة معرفة كلمة المرور التي تم تشفيرها بها. مرة أخرى ، ليست مشكلة كبيرة في حالتك لأنها تؤثر فقط على المستخدم الذي تم اختراقه بالفعل بوسائل أخرى.


إنني أقترح فقط تشفير المفتاح العام إذا كنت تريد القدرة على تعيين كلمة مرور المستخدم دون تفاعلها (يمكن أن يكون ذلك مفيدًا لعمليات إعادة التعيين وكلمات المرور المشتركة).

المفتاح العمومي

  1. امتداد OpenSSL ، على وجه التحديد ، openssl_public_encrypt و openssl_private_decrypt
  2. هذا من شأنه أن يكون على التوالي RSA بافتراض أن كلمات السر الخاصة بك سوف تناسب حجم المفتاح - الحشو ، وإلا فإنك تحتاج إلى طبقة متماثلة
  3. قم بتخزين كلا المفتاحين لكل مستخدم ، وكلمة مرور المفتاح الخاص هي كلمة مرور التطبيق الخاصة بها

متماثل

  1. تمديد Mcrypt
  2. قد يكون AES-256 رهانًا آمنًا ، لكن قد يكون هذا سؤالًا في حد ذاته
  3. أنت لا - ستكون كلمة المرور الخاصة بالتطبيق

على حد سواء

4 . نعم - يجب على المستخدمين إدخال كلمة مرور التطبيق الخاصة بهم في كل مرة ، ولكن تخزينها في الجلسة يثير مشكلات أخرى

5 .

  • إذا قام شخص ما بسرقة بيانات التطبيق ، فسيكون ذلك آمنًا مثل التشفير المطابق (في نظام المفتاح العام ، يتم استخدامه لحماية المفتاح الخاص باستخدام عبارة المرور.)
  • يجب أن يكون تطبيقك بالتأكيد متاحًا فقط عبر طبقة المقابس الآمنة ، ويفضل استخدام شهادات العميل.
  • ضع في اعتبارك إضافة عامل ثانٍ للمصادقة لا يمكن استخدامه إلا مرة واحدة لكل جلسة ، مثل رمز مميز يتم إرساله عبر الرسائل القصيرة.

استخدم password_hash و password_verify

<?php
/**
 * In this case, we want to increase the default cost for BCRYPT to 12.
 * Note that we also switched to BCRYPT, which will always be 60 characters.
 */
$options = [
    'cost' => 12,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>

وفك تشفير:

<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

  1. وظيفة PHP التي تتابعها هي Mcrypt ( http://www.php.net/manual/en/intro.mcrypt.php ).

تم تعديل المثال من الدليل قليلاً لهذا المثال):

<?php
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "This is a very secret key";
$pass = "PasswordHere";
echo strlen($pass) . "\n";

$crypttext = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $pass, MCRYPT_MODE_ECB, $iv);
echo strlen($crypttext) . "\n";
?>

يمكنك استخدام mcrypt_decrypt لفك تشفير كلمة المرور الخاصة بك.

  1. أفضل algorithm غير ذاتية - اسأل 5 أشخاص ، احصل على 5 إجابات. شخصيا إذا كان الافتراضي (السمكة المنتفخة) ليست جيدة بما فيه الكفاية بالنسبة لك ، ربما لديك مشاكل أكبر!

  2. وبالنظر إلى أن PHP تحتاج إلى تشفير - لست متأكدًا من أنه يمكنك إخفاؤه في أي مكان - نرحب بالتعليقات على ذلك. تطبق أفضل ممارسات الترميز PHP القياسية بالطبع!

  3. وبالنظر إلى أن مفتاح التشفير سيكون موجودًا في التعليمات البرمجية الخاصة بك على أي حال ، فأنت غير متأكد مما ستكسبه ، مما يعني أن تأمين بقية طلبك آمن.

  4. من الواضح ، إذا سرقت كلمة المرور المشفرة ومفتاح التشفير ، ثم أكثر من لعبة.

لقد وضعت متسابق على جوابي - أنا لست خبيراً في التشفير ، لكنني أعتقد أن ما أجبت به هو ممارسة معيارية - أرحب بالتعليقات التي قد تكون لديكم.


اقترح الكثير من المستخدمين استخدام mcrypt ... وهو أمر صحيح ، ولكني أحب أن أخطو خطوة أخرى لجعل تخزينها ونقلها أمرًا سهلاً (حيث أن القيم المشفرة في بعض الأحيان قد تجعل من الصعب إرسالها باستخدام تقنيات أخرى مثل curl أو json) .

بعد تشفير بنجاح باستخدام mcrypt ، قم بتشغيله من خلال base64_encode ثم قم بتحويله إلى hex code. وبمجرد الوصول إلى الشفرة السداسية ، يكون من السهل نقلها بطرق متنوعة.

$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$key = substr("SUPERSECRETKEY",0,mcrypt_enc_get_key_size($td));
mcrypt_generic_init($td, $key, $iv);
$encrypted = mcrypt_generic($td, $unencrypted);
$encrypted = $ua."||||".$iv;
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$encrypted = base64_encode($encrypted);
$encrypted = array_shift(unpack('H*', $encrypted));

وعلى الجانب الآخر:

$encrypted = pack('H*', $encrypted);
$encrypted = base64_decode($encrypted);
list($encrypted,$iv) = explode("||||",$encrypted,2);
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$key = substr("SUPERSECRETKEY",0,mcrypt_enc_get_key_size($td));
mcrypt_generic_init($td, $key, $iv);
$unencrypted = mdecrypt_generic($td, $encrypted);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

يمكنك تشفير كلمة المرور + ملح مع مفتاح عام. لتسجيلات الدخول ، فقط تحقق مما إذا كانت القيمة المخزنة تساوي القيمة المحسوبة من إدخال المستخدم + الملح. إذا كان هناك وقت ، عندما يلزم استعادة كلمة المرور بنص عادي ، يمكنك فك تشفيرها يدويًا أو شبه تلقائي باستخدام المفتاح الخاص. قد يتم تخزين المفتاح الخاص في مكان آخر ، وقد يتم تشفيره بشكل متناظر (والذي سيحتاج إلى تفاعل بشري لفك تشفير كلمة المرور بعد ذلك).

أعتقد أن هذا في الواقع يشبه الطريقة التي يعمل بها عامل استرداد Windows .

  • يتم تخزين كلمات المرور المشفرة
  • يمكن للناس تسجيل الدخول دون فك تشفير إلى نص عادي
  • يمكن استعادة كلمات المرور إلى نص عادي ، ولكن فقط باستخدام مفتاح خاص ، يمكن تخزينه خارج النظام (في خزنة بنكية ، إذا كنت ترغب في ذلك).






php security encryption passwords