سؤال

في برنامجي، نقوم بتخزين عنوان IP للمستخدم في سجل. عندما نعرض قائمة السجلات للمستخدم، لا نريد التخلي عن عنوان IP للمستخدم الآخر، لذلك نحن SHA1 Hash IT. ثم، عندما ينقر المستخدم على سجل، فإنه يذهب إلى عنوان URL مثل هذا:

http://www.example.com/allrecordsbyipaddress.php?ipaddress=SHA1HASHOFTHEIPADDRESS

الآن، أحتاج إلى سرد جميع السجلات حسب عنوان IP المحدد في HASH SHA1. حاولت هذا:

SELECT * FROM records 
WHERE SHA1(IPADDRESS)="da39a3ee5e6b4b0d3255bfef95601890afd80709"

لكن هذا لا يعمل. كيف يمكنني ان افعل هذا؟
شكرا، إسحاق

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

المحلول

كنت أخزن Sha1 من IP في قاعدة البيانات مع IP الخام، بحيث يصبح الاستعلام

SELECT * FROM records WHERE ip_sha1 = "..."

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

تخزين SHA1 Hash تمنحك قاعدة البيانات أيضا فرصة لإضافة مؤشر ثانوي على IP_SHA1 لتسريع ذلك. إذا كان لديك مجموعة بيانات كبيرة جدا، فقم بعمل SHA1 في المكان الذي يفرضه Cleanes قاعدة البيانات للقيام بمسح طاولة كاملة، إلى جانب إعادة حساب لكل سجل في كل فحص.

نصائح أخرى

لا أعرف ما إذا كان يهم، ولكن الخاص بك SHA1 هاش da39a3ee5e6b4b0d3255bfef95601890afd80709 هو تجزئة معروفة من سلسلة فارغة.

هل هو مجرد مثال أو نسيت أن تقدم الفعلي IP العنوان إلى وظيفة حساب التجزئة؟

تحديث:

هل ينشئ رمز صفحة الويب الخاصة بك SHA1 التجزئة في صغيرة؟

هذا الاختيار سوف تفشل في MySQL:

SELECT  SHA1('') = 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709'

في هذه الحالة، استخدم هذا:

SELECT  SHA1('') = LOWER('DA39A3EE5E6B4B0D3255BFEF95601890AFD80709')

, والتي سوف تنجح.

أيضا، يمكنك اطلاق النار SHA1 التجزئة عند إدراج السجلات في الجدول:

INSERT
INTO    ip_records (ip, ip_sha)
VALUES  (@ip, SHA1(CONCAT('my_secret_salt', @ip))

SELECT  *
FROM    ip_records
WHERE   ip_sha = @my_salted_sha1_from_webpage

هذا سوف يعيدك الأصلي IP والسماح بفهرسة ip_sha, ، بحيث سيعمل هذا الاستعلام بسرعة.

في كل مرة يكون لدي عدم تطابق تجزئة غير متوقع، كان لأنني أتعشلت بطريق الخطأ سلسلة تضمنت بعض المسافة بيضاء، مثل "\n".

مجرد فكرة سريعة: هذا هو عبارة بسيطة للغاية. هناك 2 فقط32 عناوين IP الممكنة، لذلك إذا أراد شخص ما مع المعرفة التقنية معرفة ذلك، فيمكنهم فعل ذلك من خلال حساب كل 4 مليارات تجزئة، والتي لن تستغرق وقتا طويلا. اعتمادا على حساسية عناوين IP هذه، قد ترغب في النظر في جدول بحث خاص.

هل تقارن إخراج خوارزمية التجزئة الخاصة بك مع إخراج SHA1 () MySQL ()؟ على سبيل المثال عنوان IP 1.2.3.4؟

انتهى بي الأمر بتشفير عناوين IP وفك تشفيرها من خلال الصفحة الأخرى. ثم يمكنني فقط استخدام عنوان IP الخام في استعلام SQL. أيضا، يحمي من هجمات القوة الغاشمة، مثل حكم الفرد المطلق قال.

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