هل هناك أفضل خوارزمية .NET لتشفير بطاقات الائتمان؟

StackOverflow https://stackoverflow.com/questions/41220

سؤال

الشبكة System.Security.Cryptography تحتوي مساحة الاسم على مجموعة مذهلة من الخوارزميات التي يمكنني استخدامها لتشفير تفاصيل بطاقة الائتمان.ايهما الافضل؟

من الواضح أنه يجب أن يكون آمنًا لسلسلة قصيرة نسبيًا.

يحرر:أنا في المملكة المتحدة، حيث أفهم أنه لا بأس من تخزين تفاصيل بطاقة الائتمان المشفرة طالما لم يتم تخزين رقم CVV المكون من ثلاثة أرقام مطلقًا.وشكرا لكم جميعا على الردود الرائعة.

هل كانت مفيدة؟

المحلول

ليس هناك أي إساءة، ولكن السؤال "مضلل" بعض الشيء.لا يوجد حل "رصاصة فضية".أوصي بقراءة علم التشفير بشكل عام ثم القيام ببعض نماذج التهديدات.بعض الأسئلة (ليست قائمة شاملة بأي حال من الأحوال) يجب أن تطرحها على نفسك:

  • هل الوحدة التي تقوم بالتشفير هي التي تحتاج إلى فك تشفيرها (في هذه الحالة استخدم التشفير المتماثل) أم أنها سترسل البيانات إلى وحدة أخرى (على جهاز آخر) والتي ستستخدمها (وفي هذه الحالة يجب عليك التفكير في المفتاح العام التشفير)
  • ما الذي تريد الحماية منه؟شخص ما يصل إلى قاعدة البيانات ولكن ليس لديه الكود المصدري (وفي هذه الحالة يمكنك ترميز مفتاح التشفير مباشرة في المصدر)؟هل يتعرف شخص ما على شبكتك المحلية (يجب أن تفكر في حلول شفافة مثل IPSec)؟هل يقوم شخص ما بسرقة خادمك (يمكن أن يحدث ذلك حتى في مراكز البيانات - وفي هذه الحالة يجب مراعاة تشفير القرص بالكامل)؟
  • هل تحتاج حقًا إلى الاحتفاظ بالبيانات؟ألا يمكنك تمريرها مباشرة إلى معالج بطاقة الائتمان ومسحها بعد حصولك على التأكيد؟ألا يمكنك تخزينها محليًا لدى العميل في ملف تعريف الارتباط أو Flash LSO؟إذا قمت بتخزينه لدى العميل، فتأكد من تشفيره على جانب الخادم قبل وضعه في ملف تعريف الارتباط.وأيضًا، إذا كنت تستخدم ملفات تعريف الارتباط، فتأكد من جعلها http فقط.
  • هل يكفي مقارنة تكافؤ البيانات (أي أن البيانات التي قدمها لي العميل هي نفس البيانات التي لدي)؟إذا كان الأمر كذلك، فكر في تخزين تجزئة منه.نظرًا لأن أرقام بطاقات الائتمان قصيرة نسبيًا وتستخدم مجموعة منخفضة من الرموز، فيجب إنشاء ملح فريد لكل منها قبل التجزئة.

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

نصائح أخرى

لا يهم.

يجب ألا تلمس أرقام البطاقة الكاملة القرص مطلقًا.

كل ما يهم هو رمز المصادقة.

بالنسبة للآثار وما إلى ذلك، ستستخدم فقط آخر 4 أرقام xxxx xxxx xxxx 1234 وتاريخ انتهاء الصلاحية.

إذا كنت ستقوم بتخزين أرقام البطاقات، فسيتم تفويض خيار التشفير من قبل البنك المستفيد.

ما لم تكن أنت المستحوذ، في هذه الحالة يجب أن يكون هناك مبرمج يونكس قديم/رجل db2 يجب أن تسأله.

"ألا يمكنك تخزينه محليًا لدى العميل في ملف تعريف الارتباط" <-- أبدًا

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

إذا كنت بحاجة إلى إجراء دفعات متكررة، فإن معظم موفري CC سيقدمون طريقة للقيام بذلك عن طريق تخزين نوع من الرمز المميز من الدفعة الأولية، دون الاحتفاظ برقم البطاقة على الإطلاق (يمكنك فقط الاحتفاظ بالأرقام الأربعة الأخيرة لعرضها للعميل حتى يتمكنوا من معرفة البطاقة المخزنة).

حقا، فقط لا تفعل ذلك!

كما يجب ألا تحتفظ أبدًا برمز CCV.

حسب PCI DSS قواعد الامتثال، فإن أي معيار تشفير رائد في الصناعة يكفي.لذا فإن 3DES بمفتاح 256 بت يعد جيدًا بدرجة كافية (على الرغم من إمكانية استخدام معايير أخرى).تحقق من هذا http://pcianswers.com/2006/08/09/methods-of-encrypting-data/

لا تنسى النزاهة هنا.هناك هجمات تزوير ضد التشفير الجاهز عندما لا يعرف المهاجم المفتاح، ولكن يمكنه التلاعب بالنص المشفر.يمكن أن تكون هذه الأشياء سيئة بشكل خاص عندما:

  • تشفير السلاسل القصيرة,
  • مع سلاسل فرعية معروفة

هذا هو الحال بالضبط بالنسبة لبطاقات الائتمان.لذا، فإن استخدام System.Security.Cryptography AES أو 3DES في وضع CBC دون تدوير المجموع الاختباري الخاص بك قد يكون خطيرًا.يقرأ:هناك احتمال أن يتمكن مهاجم ليس لديه المفتاح السري من استبدال رقم بطاقة ائتمان برقم آخر.

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

ليس هناك نقطة.

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

هناك أيضًا الجانب القانوني الذي يجب مراعاته.لا أعرف الوضع في أي مكان آخر ولكن في ألمانيا، لا يُسمح لك بتخزين أرقام بطاقات الائتمان1). فترة. لا يهم ما إذا كنت تقوم بتشفيرها أم لا وبأي تنسيق تقوم بتخزينها.

كلك يمكن ما يجب فعله (وهنا أشير من الذاكرة، دون أي معرفة قضائية) هو تخزين تجزئة قوية (SHA-256؟) لرقم بطاقة الائتمان، بالإضافة إلى الأرقام الأربعة الأخيرة ورقم الحساب.ونعم، من التافه إعادة بناء العدد الكامل من هذه المعلومات وحدها.القوانين ليست دائما منطقية.


1) إلا إذا كنت معهدًا لبطاقات الائتمان معتمدًا فيدراليًا.

تَلمِيح: يجب عليك التحقق مما إذا كان من القانوني تخزين أرقام بطاقات الائتمان.في السويد على سبيل المثال، يجب أن تكون معتمدًا من قبل PCI (صناعة بطاقات الدفع), ، حيث سيتم اختبار أمانك الداخلي والخارجي (مع الكثير من الأشياء الأخرى).

يجب عليك التفكير مرة أو مرتين قبل تخزين معلومات بطاقة الائتمان، نظرًا لأن التكاليف القانونية للقيام بذلك بشكل خاطئ قد تكون باهظة الثمن.

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

شيء مثل opensl_seal الخاص بـ PHP، ولكن إذا أردت ربما باستخدام خوارزمية مختلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top