شرح مكتبة hashlib و التعامل معها في لغة بايثون - ProgrammerTech
Language:

Search

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

  • Share this:
شرح مكتبة hashlib و التعامل معها في لغة بايثون

مكتبة 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())
1-114.webp

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


Muhammad Alush

Muhammad Alush

إسمي محمد تركي العلوش محب للتقنية و التعلم الذاتي, و جميع خبراتي تعلمتها ذاتياً, و اللغات البرمجية التي أتقنها هي html, css, javascript, php, c, python بالإضافة إلى حبي الكبير لمجال الشبكات.

موقعي programmer-tech.com