مكتبة hashlib في بايثون
مكتبة ( hashlib ) "هاش ليب" هي مكتبة تُمكننا من معرفة أنواع الهاش التي تُستخدم في الـ security. و بالأخص في تطبيقات الويب و هذا كان مثال بسيط أنه لما نأتي لتخزين بيانات مثل باسورد Password أو بيانات حساسة نعمل لها عملية تشفير hashing. يعني تغيير الصيغة للبيانات و لا يمكن عمل عليه عملية عكسية, و العملية كلها تعود في السكيورتي بحيث إذا أدخلنا String يخرج لنا hash.
و الهاش لا يمكن عمل عملية لإرجاعه للكلمة الأصلية, لكن في موضوع آخر إسمه فك تشفير و مفتاح لفك التشفير. و يتم إستخدم هجمة القوى الغاشمة brute-forse وبهذا الأمر مع هذا النوع في بعض الأحيان يأتي بنتيجة و إحيانا لا. سوف نتحدث فقط عن إستخدام المكتبة و التعريف بها, و نستدعي المكتبة اولاً ببداية البرنامج بالأمر.
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 للهاش الذي نعطيه لها.