
شرح مكتبة hashlib و التعامل معها في لغة بايثون
مكتبة (hashlib) “هاش ليب” هي مكتبة تُمكننا من معرفة أنواع الهاش التي تُستخدم في الـ security. و بالأخص في تطبيقات الويب و هذا كان مثال بسيط أنه لما نأتي لتخزين بيانات مثل باسورد Password أو بيانات حساسة نعمل لها عملية تشفير hashing.
يعني تغيير الصيغة للبيانات و لا يمكن عمل عليه عملية عكسية, و العملية كلها تعود في السكيورتي بحيث إذا أدخلنا String يخرج لنا hash.
و الهاش لا يمكن عمل عملية لإرجاعه للكلمة الأصلية, لكن في موضوع آخر إسمه فك تشفير و مفتاح لفك التشفير. و يتم إستخدم هجمة القوى الغاشمة brute force وبهذا الأمر مع هذا النوع في بعض الأحيان يأتي بنتيجة و إحيانا لا. سوف نتحدث فقط عن إستخدام المكتبة و التعريف بها, و نستدعي المكتبة اولاً ببداية البرنامج بالأمر.
import hashlib
و لها العديد من الوثائق و الأوامر التي تُستخدَم معها للإطلاع عليها جميعها إضغط هنا ليتم تحويلك لرابط المكتبة و رؤية جميع ما يستخدم معها. مثلاً سوف نستخدم الأمر algorithms_guaranteed لرؤية الخوارزميات المستخدمة في التشفير.
امر algorithms_guaranteed في مكتبة hashlib
امر algorithms_guaranteed يستخدم من أجل عرض جميع الخوارزميات التي يمكن إستخدامها في التشفير في هذه المكتبة.
>>> import hashlib >>> hashlib.algorithms_guaranteed {'sha384', 'md5', 'sha512', 'sha256', 'sha3_224', 'blake2b', 'shake_128', 'sha3_512', 'shake_256', 'sha3_384', 'blake2s', 'sha3_256', 'sha1', 'sha224'}
كما نلاحظ لقد عرض لنا جميع الخوارزميات المستخدمة في المكتبة أي خوارزميات التي يمكن أن نشفر بها.
امر algorithms_available في مكتبة hashlib
بواسطة algorithms_available يمكّننا من معرفة الخوارزميات المتاحة.
>>> import hashlib >>> hashlib.algorithms_available {'md4', 'md5-sha1', 'sha512_224', 'blake2b', 'sha3_512', 'sha512_256', 'sha224', 'whirlpool', 'sha384', 'sha3_224', 'blake2s', 'md5', 'sha256', 'shake_128', 'sha3_384', 'sha3_256', 'sha1', 'sha512', 'ripemd160', 'sm3', 'shake_256'}
يمكن عمل حلقة for لمعرفة جميع أنواع الهاش المتاحة بشكل مٌنظَّم.
>>>import hashlib >>>hashlib.algorithms_available >>>for h in hashlib.algorithms_available: print(h) #الناتج هو md4 md5-sha1 sha512_224 blake2b sha3_512 sha512_256 sha224 whirlpool sha384 sha3_224 blake2s md5 sha256 shake_128 sha3_384 sha3_256 sha1 sha512 ripemd160 sm3 shake_256
للبدء في عملية تشفير أي بيانات و نريد الحصول على تشفير لها, على سبيل المثال سوف اُشفر كلمة saja بتشفير md5 ثم طريقة العرض هي utf-8.
>>>import hashlib >>>data = "saja" >>>hasht = hashlib.new("md5") >>>hasht.update(data.encode('utf-8')) >>>hasht.hexdigest() 'f338090a40ae3f84f753a4877af34a05'
لتشفير الكلمة السابقة بكل الأنواع المتاحة دفعة واحدة
>>>import hashlib >>>data = "saja" >>>hasht = hashlib.new("md5") >>>hasht.update(data.encode('utf-8')) >>>for h in hashlib.algorithms_available: hasht = hashlib.new("{0}".format(h)) hasht.update(b'saja') print(hasht.hexdigest())
كما نلاحظ أنه قد شفرها لنا بعدة تشفيرات و أظهر خطأ و الخطأ يعني أن بعض التشفيرات تحتاج التشفير بها بمفردها. لأنها تحتاج إلى length معين و تحتاج argument, و إذا نريد معرفة نوع الهاش الذي توقف عنده و ظهر الخطأ نستخدم كالتالي.
>>>import hashlib >>>data = "saja" >>>hasht = hashlib.new("md5") >>>hasht.update(data.encode('utf-8')) >>>for h in hashlib.algorithms_available: hasht = hashlib.new("{0}".format(h)) hasht.update(b'saja') print(h) print(hasht.hexdigest())
sha224 0f12d8f0dfdd9c43d5d4d3d5b4d4416ab12295aaefea44c33a95ad9f md5 f338090a40ae3f84f753a4877af34a05 sha256 aca1501da405994398f67b3d8a18df504abeb4a805def453b7ef8a3cf0a715af blake2b 11231c77d4101beee0dc064f562cb4d3e340a2f534f91d74f8a23401bf67b7a98a9472b34ec0786823657d3256c699334122c693c89e17c76e23a05617bbd04a sha512 6e1f454cdeec16b80069ec360cb99e8f0d62a40c948319c32d8e9b2c11bc2af3d2e877c3a07e8269772e95ad7f42c386daf11bd7e7d7dde8b18ac1b7e66d3b3a sha1 732ab91d5f051ce61d31385590136d60163dc595 sha3_384 168d4a4ce22a8f42a7b31c8e1a169192844cd6ffd390ce29b5daacee201ede92dcbac906d0b6514dbd6d538224d6d9ee sha512_256 23303bca1df1b803cad014d27dfe03d5028640517771e20687dbe31cdca0ee6a sha384 583067bb083f55234b0f50ea9261face6e0874ee29bb610ebdcbb41dc5a016465c45cf8bf99ca7dae29de4d3ad9af1cb sha3_512 f8fa54bb117fc8f384c4953f6b4237dfdc252eb0f9d71a2676e8f6eebfc93d32e7a364afe5118f1111aa22772d8d5079bfcf4f9a447ee0bcb28910c64901f085 md5-sha1 f338090a40ae3f84f753a4877af34a05732ab91d5f051ce61d31385590136d60163dc595 blake2s 0277b52e8ca9fa2e54cea0c36296b544fce8db66f0c1c505533b1e0a6afe6f65 ripemd160 ed61faae43315ed49d86ad8e8665a5e0379b51ce sm3 8fd43a7fb95a4653bb6b8872313c62161507dd708cc33af3537b0a5931aba7c1 md4 3cd261a1b227cfa00af1c2017fded9ad sha3_256 6dbece6f0d44f11d6fe3f9c11aa91edc66cac71760b12f7dc22872decbbc14fa shake_128 Traceback (most recent call last): File "<stdin>", line 5, in <module> TypeError: hexdigest() missing required argument 'length' (pos 1)
كما نلاحظ أنه اعطانا التشفير الذي توقفت عنده المشكلة و إسمه shake_256 يعني يحتاج length ليشفر به. إذا نريد أن نشفر في التشفير الذي توقف عنده نقوم بإعطاءه طول كما يحتاج
>>>hasht = hashlib.new("shake_256") >>>hasht.update(b'saja') >>>hasht.hexdigest(15) '0a95dbcffae7fcc47b6ea174fa5942'
كما نلاحظ أنه تم التشفير فهذا يعني فهو متغير حسب الطول الذي نعطيه له, إذا اعطيناه 5 سيعطينا هاش طول 5 و إذا 10 كذلك الأمر. هذا كان بالنسبة لموضوع hashlib يعني إذا دخلنا لقاعدة بيانات موقع ما أو تطبيق سوف نجد هاش او هاشات غير مفهومة لدينا و لا نعرف كيفية فك هذه البيانات للدخول للموقع.
نبدأ بالدخول لبعض المواقع نجد بها السرعة عالية جداً و هذه المواقع يكون عملها عمل brute-forse للهاش الذي نعطيه لها.
اطرق تعليق لنري ما رضاكم علي الدروس التي نقدمها (إن كان هناك مشكلة في الدرس يمكنك التحدث مع فريق الدعم لحل لك المشكلة او طرق تعليق بتلك المشكلة ليتم التفاعل من خلال الزوار الآخرين)