Python Programming

شرح مكتبة hashlib و التعامل معها في لغة بايثون 27

مكتبة hashlib في بايثون

شرح مكتبة 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())

امر algorithms_available في مكتبة hashlib

كما نلاحظ أنه قد شفرها لنا بعدة تشفيرات و أظهر خطأ و الخطأ يعني أن بعض التشفيرات تحتاج التشفير بها بمفردها. لأنها تحتاج إلى 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())

length argument

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 للهاش الذي نعطيه لها.


اطرق تعليق لنري ما رضاكم علي الدروس التي نقدمها (إن كان هناك مشكلة في الدرس يمكنك التحدث مع فريق الدعم لحل لك المشكلة او طرق تعليق بتلك المشكلة ليتم التفاعل من خلال الزوار الآخرين)

 

Ahmedkaissar

من مصر من محافظة الجيزة مبرمج ويب و خبير أمن معلومات محب للتقنية و الأمن المعلوماتي مدرب للغات "Python,html, css, php, js, laravel"
زر الذهاب إلى الأعلى