این ماژول یک رابط مشترک را برای بسیاری از الگوریتمهای هش متفاوت پیادهسازی میکند. موارد شاملشده عبارتاند از الگوریتمهای هش امن FIPS یعنی SHA224، SHA256، SHA384، SHA512، (تعریفشده در the FIPS 180-4 standard)، سری SHA-3 (تعریفشده در the FIPS 202 standard) و همچنین الگوریتمهای قدیمی SHA1 (formerly part of FIPS) و الگوریتم MD5 (تعریفشده در سند اینترنتی RFC 1321).
نکته
اگر به توابع هش adler32 یا crc32 نیاز دارید، این توابع در ماژول zlib در دسترس هستند.
برای هر نوع هش (hash)، یک متد سازنده با همان نام وجود دارد. همه آنها یک شیء هش با رابط ساده یکسان برمیگردانند. برای مثال: از sha256() برای ایجاد یک شیء هش SHA-256 استفاده کنید. اکنون میتوانید با استفاده از متد update، این شیء را با اشیاء شبهبایت (بهطور معمول bytes) تغذیه کنید. در هر زمان میتوانید با استفاده از متدهای digest() یا hexdigest()، چکیده (digest) حاصل از الحاق دادههایی که تاکنون به آن داده شده است را از آن بخواهید.
برای امکانپذیر کردن چندنخی، GIL پایتون هنگام محاسبهی هشی که بیش از ۲۰۴۷ بایت داده را بهصورت یکجا در سازنده یا متد .update خود دریافت کرده است، آزاد میشود.
با این حال، هر یک از این موارد ممکن است در محیطهای غیرمعمول، مانند ساخت کمیاب «سازگار با FIPS» از پایتون یا زمانی که «حالت FIPS» کتابخانهی OpenSSL بهگونهای پیکربندی شده باشد که برخی الگوریتمها را از ارائهدهندهی پیشفرض خود مستثنی کند، مفقود یا مسدود شده باشند. فراخوانی سازندهی الگوریتمی که در دسترس نیست، استثنای ValueError را بالا میآورد.
اگر hashlib توزیع پایتون شما با ساختی از OpenSSL پیوند داده شده باشد که سایر الگوریتمها را فراهم کند، ممکن است الگوریتمهای اضافی دیگری نیز در دسترس باشند. سایر الگوریتمها در دسترس بودنشان در همه نصبها تضمین نمیشود و تنها با نام از طریق new() قابل دسترسی خواهند بود. algorithms_available را ببینید.
تغییر یافته در نسخهی 3.9: تمام سازندههای hashlib یک آرگومان فقط کلیدواژهای usedforsecurity با مقدار پیشفرض True میپذیرند. یک مقدار نادرست اجازه میدهد از الگوریتمهای هش ناامن و مسدودشده در محیطهای محدودشده استفاده شود. False نشان میدهد که الگوریتم هش در یک زمینهی امنیتی استفاده نمیشود، مثلاً بهعنوان یک تابع فشردهسازی یکطرفهی غیررمزنگاری.
تغییر یافته در نسخهی 3.9: Hashlib اکنون در صورتی که OpenSSL آنها را فراهم کند، از SHA3 و SHAKE از OpenSSL استفاده میکند.
تغییر یافته در نسخهی 3.12: برای هر یک از الگوریتمهای MD5، SHA1، SHA2 یا SHA3 که OpenSSL پیونددادهشده آنها را فراهم نمیکند، به یک پیادهسازی تأییدشده از HACL* project متوسل میشویم.
منسوخ شده از نسخهی 3.15, در نسخهی 3.19 حذف خواهد شد: پارامتر کلیدواژهی مستندنشدهی string در _hashlib.new() و سازندههای نامگذاریشدهی هش مانند _md5.md5() منسوخ شده است. برای حداکثر سازگاری با نسخههای قبلی، ترجیح بر این است که دادههای اولیه به عنوان یک آرگومان جایگاهی ارسال شوند.
یک سازندهی عام است که رشتهی name الگوریتم مورد نظر را بهعنوان نخستین پارامتر خود میگیرد. همچنین وجود دارد تا امکان دسترسی به هشهای فهرستشده در بالا و نیز هر الگوریتم دیگری را که کتابخانهی OpenSSL شما ممکن است ارائه دهد، فراهم کند.
مجموعهای شامل نامهای الگوریتمهای هش که تضمین شده است این ماژول در همه پلتفرمها از آنها پشتیبانی میکند. توجه داشته باشید که 'md5' با وجود اینکه برخی فروشندگان بالادستی یک ساخت پایتون عجیب «منطبق با FIPS» ارائه میکنند که آن را حذف میکند، در این فهرست قرار دارد.
مجموعهای شامل نامهای الگوریتمهای هش موجود در مفسر پایتونِ در حال اجرا است. این نامها هنگامی که به new() ارسال شوند، شناخته خواهند شد. algorithms_guaranteed همیشه زیرمجموعهای خواهد بود. ممکن است یک الگوریتم یکسان چندین بار با نامهای مختلف در این مجموعه ظاهر شود (به لطف OpenSSL).
نام کانونیکال این هش، که همیشه با حروف کوچک است و همیشه بهعنوان پارامتری برای new() جهت ایجاد هش دیگری از این نوع مناسب است.
تغییر یافته در نسخهی 3.4: ویژگی name از ابتدای پیدایش CPython وجود داشته است، اما تا Python 3.4 بهطور رسمی مشخص نشده بود، بنابراین ممکن است در برخی پلتفرمها وجود نداشته باشد.
شیء هش را با bytes-like object بهروزرسانی کنید. فراخوانیهای مکرر معادل یک فراخوانی با الحاق همه آرگومانها است: m.update(a);m.update(b) معادل m.update(a+b) است.
چکیدهای از دادههایی که تاکنون به متد update() ارسال شده است را برمیگرداند. این یک شیء از نوع bytes به اندازه digest_size است که ممکن است حاوی بایتهایی در کل بازه از ۰ تا ۲۵۵ باشد.
مانند digest()، با این تفاوت که چکیده بهصورت یک شیء رشتهای با طولی دو برابر برگردانده میشود که تنها شامل ارقام مبنای شانزده است. میتوان از آن برای تبادل امن مقدار در ایمیل یا سایر محیطهای غیردودویی استفاده کرد.
الگوریتمهای shake_128() و shake_256() چکیدههایی با طول متغیر فراهم میکنند که length_in_bits//2 آنها تا ۱۲۸ یا ۲۵۶ بیت امنیت دارد. به همین دلیل، متدهای digest آنها نیازمند یک طول هستند. حداکثر طول توسط الگوریتم SHAKE محدود نشده است.
خلاصهی دادههایی که تاکنون به متد update() ارسال شدهاند را برمیگرداند. این یک شیء bytes به اندازهی length است که ممکن است شامل بایتهایی در کل بازهی ۰ تا ۲۵۵ باشد.
مانند digest() است، با این تفاوت که مقدار خلاصه بهصورت یک شیء رشتهای با طولی دو برابر برگردانده میشود که فقط شامل ارقام مبنای شانزده است. میتوان از آن برای تبادل مقدار در ایمیل یا سایر محیطهای غیردودویی استفاده کرد.
نمونه استفاده:
>>> h=hashlib.shake_256(b'Nobody inspects the spammish repetition')>>> h.hexdigest(20)'44709d6fcb83d92a76dcb0b668c98e1b1d3dafe7'
یک شیء digest برمیگرداند که با محتوای شیء پرونده بهروزرسانی شده است.
fileobj باید یک شیء شبهپرونده باشد که برای خواندن در حالت دودویی باز شده باشد. اشیای پرونده حاصل از تابع توکار open()، نمونههای BytesIO، اشیای SocketIO حاصل از socket.socket.makefile() و موارد مشابه پذیرفته میشوند. fileobj باید در حالت مسدودکننده باز شده باشد، در غیر این صورت ممکن است BlockingIOError پرتاب شود.
این تابع ممکن است ورودی/خروجی پایتون را دور بزند و بهطور مستقیم از توصیفگر فایلِ حاصل از fileno() استفاده کند. باید فرض شود که fileobj پس از بازگشت یا پرتاب استثنا توسط این تابع، در وضعیت نامعلومی قرار دارد. بستن fileobj بر عهدهی فراخواننده است.
digest باید یکی از این موارد باشد: نام یک الگوریتم هش بهصورت str، یک سازنده هش، یا یک شیء فراخوانیپذیر که یک شیء هش برمیگرداند.
تغییر یافته در نسخهی 3.14: اکنون اگر پرونده در حالت غیرمسدودکننده باز شده باشد، BlockingIOError پرتاب میشود. پیشتر، بایتهای نول کاذب به خلاصه افزوده میشدند.
الگوریتمهای اشتقاق کلید و کشش کلید (key derivation and key stretching) برای هش کردن امن گذرواژه طراحی شدهاند. الگوریتمهای سادهای مانند sha1(password) در برابر حملات جستجوی فراگیر (brute-force) مقاوم نیستند. یک تابع خوب برای هش کردن گذرواژه باید قابلتنظیم، کند و شامل یک نمک (salt) باشد.
این تابع، تابع استخراج کلید مبتنی بر گذرواژه PKCS#5 نسخه 2 را فراهم میکند. این تابع از HMAC بهعنوان تابع شبهتصادفی استفاده میکند.
رشته hash_name نام موردنظر الگوریتم خلاصهسازی هش برای HMAC است، برای مثال 'sha1' یا 'sha256'. password و salt بهعنوان بافرهایی از بایتها تفسیر میشوند. برنامهها و کتابخانهها باید password را به یک طول معقول محدود کنند (برای مثال ۱۰۲۴). salt باید حدود ۱۶ بایت یا بیشتر از یک منبع مناسب باشد، برای مثال os.urandom().
تعداد تکرارها باید بر اساس الگوریتم هش و توان محاسباتی انتخاب شود. از سال ۲۰۲۲، صدها هزار تکرار از SHA-256 پیشنهاد میشود. برای درک دلیل و شیوه انتخاب بهترین گزینه برای برنامهتان، پیوست A.2.2 از NIST-SP-800-132 را بخوانید. پاسخهای موجود در stackexchange pbkdf2 iterations question بهتفصیل توضیح دادهاند.
dklen طول کلید مشتقشده بر حسب بایت است. اگر dklen برابر None باشد، از اندازهی چکیدهی الگوریتم هش hash_name استفاده میشود، مثلاً ۶۴ برای SHA-512.
تابع تنها زمانی در دسترس است که پایتون با OpenSSL کامپایل شده باشد.
اضافه شده در نسخهی 3.4.
تغییر یافته در نسخهی 3.12: تابع اکنون تنها زمانی در دسترس است که پایتون با OpenSSL ساخته شده باشد. پیادهسازی کندِ پایتون خالص حذف شده است.
hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)¶
این تابع، تابع استخراج کلید مبتنی بر گذرواژهی scrypt را همانگونه که در RFC 7914 تعریفشده است، فراهم میکند.
password و salt باید اشیاء شبهبایت (bytes-like object) باشند. برنامهها و کتابخانهها باید password را به یک طول معقول محدود کنند (برای مثال ۱۰۲۴). salt باید حدود ۱۶ بایت یا بیشتر از یک منبع مناسب باشد، برای مثال os.urandom().
n عامل هزینهی CPU/حافظه است، r اندازهی بلوک، p عامل موازیسازی و maxmem حافظه را محدود میکند (مقدار پیشفرض در OpenSSL 1.1.0 برابر ۳۲ MiB است). dklen طول کلید مشتقشده بر حسب بایت است.
این توابع، اشیای هش متناظر برای محاسبهی BLAKE2b یا BLAKE2s را برمیگردانند. آنها بهاختیار این پارامترهای عمومی را میپذیرند:
data: تکهی اولیهای از داده برای هش کردن، که باید یک bytes-like object باشد. این آرگومان فقط میتواند بهعنوان آرگومان جایگاهی ارسال شود.
digest_size: اندازهی چکیدهی خروجی بر حسب بایت.
key: کلید برای هش کلیددار (تا ۶۴ بایت برای BLAKE2b، تا ۳۲ بایت برای BLAKE2s).
salt: نمک برای هشسازی تصادفی (تا ۱۶ بایت برای BLAKE2b، تا ۸ بایت برای BLAKE2s).
person: رشتهی شخصیسازی (تا ۱۶ بایت برای BLAKE2b و تا ۸ بایت برای BLAKE2s).
جدول زیر محدودیتهای پارامترهای عمومی (بر حسب بایت) را نشان میدهد:
هش
digest_size
len(key)
len(salt)
len(person)
BLAKE2b
64
64
16
16
BLAKE2s
32
32
8
8
نکته
مشخصات BLAKE2 طولهای ثابتی را برای پارامترهای salt و personalization تعریف میکند؛ با این حال، این پیادهسازی برای سهولت، رشتههای بایتی با هر اندازهای تا طول مشخصشده را میپذیرد. اگر طول پارامتر کمتر از طول مشخصشده باشد، با صفر پر میشود؛ بنابراین، برای مثال، b'salt' و b'salt\x00' مقدار یکسانی هستند. (این موضوع برای key صدق نمیکند.)
این اندازهها بهعنوان ثابتهای ماژول constants که در زیر توضیح داده شدهاند، در دسترس هستند.
توابع سازنده همچنین پارامترهای هشسازی درختی (tree hashing) زیر را میپذیرند:
fanout: fanout (۰ تا ۲۵۵، ۰ در صورت نامحدود بودن، ۱ در حالت ترتیبی).
depth: حداکثر عمق درخت (۱ تا ۲۵۵، ۲۵۵ اگر نامحدود باشد، ۱ در حالت متوالی).
leaf_size: حداکثر طول بایتی برگ (۰ تا 2**32-1، ۰ اگر نامحدود یا در حالت ترتیبی).
node_offset: آفست گره (node offset) (۰ تا 2**64-1 برای BLAKE2b، ۰ تا 2**48-1 برای BLAKE2s، ۰ برای اولین برگ سمت چپ، یا در حالت ترتیبی).
node_depth: عمق گره (۰ تا ۲۵۵، ۰ برای برگها، یا در حالت ترتیبی).
inner_size: اندازهی digest داخلی (۰ تا ۶۴ برای BLAKE2b، ۰ تا ۳۲ برای BLAKE2s، ۰ در حالت ترتیبی).
last_node: بولی که نشان میدهد گره پردازششده آخرین گره است (در حالت ترتیبی False).
برای محاسبهی هش برخی دادهها، باید ابتدا یک شیء هش را با فراخوانی تابع کارخانهایٔ مناسب (blake2b() یا blake2s()) بسازید، سپس با فراخوانی update() روی شیء، آن را با دادهها بهروزرسانی کنید و در نهایت، مقدار خلاصه را با فراخوانی digest() از شیء بگیرید (یا برای رشتهی کدگذاریشده بهصورت مبنای شانزده، hexdigest() را فراخوانی کنید).
BLAKE2 دارای اندازهی قابلپیکربندی برای خلاصهها است، تا ۶۴ بایت برای BLAKE2b و تا ۳۲ بایت برای BLAKE2s. برای مثال، برای جایگزینی SHA-1 با BLAKE2b بدون تغییر اندازهی خروجی، میتوانیم به BLAKE2b بگوییم خلاصههای ۲۰ بایتی تولید کند:
>>> fromhashlibimportblake2b>>> h=blake2b(digest_size=20)>>> h.update(b'Replacing SHA1 with the more secure function')>>> h.hexdigest()'d24f26cf8de66472d58d4e1b1774b4c9158b1f4c'>>> h.digest_size20>>> len(h.digest())20
اشیای هش با اندازههای چکیده متفاوت، خروجیهای کاملاً متفاوتی دارند (هشهای کوتاهتر پیشوندهای هشهای بلندتر نیستند)؛ BLAKE2b و BLAKE2s حتی اگر طول خروجی یکسان باشد، خروجیهای متفاوتی تولید میکنند:
هش کلیددار میتواند برای اصالتسنجی بهعنوان جایگزینی سریعتر و سادهتر برای کد اصالتسنجی پیام مبتنی بر هش (HMAC) استفاده شود. BLAKE2 میتواند بهلطف ویژگی تمایزناپذیری که از BLAKE به ارث رسیده است، بهصورت امن در حالت prefix-MAC استفاده شود.
این مثال نشان میدهد که چگونه میتوانید یک کد احراز هویت ۱۲۸ بیتی (کدگذاریشده به مبنای شانزده) را برای پیام b'messagedata' با کلید b'pseudorandomkey' دریافت کنید:
بهعنوان یک مثال عملی، یک برنامه کاربردی وب میتواند کوکیهای ارسالی به کاربران را بهصورت متقارن امضا کند و بعداً آنها را تأیید کند تا اطمینان حاصل شود که دستکاری نشدهاند:
با تنظیم پارامتر salt، کاربران میتوانند تصادفیسازی را در تابع هش اعمال کنند. هش تصادفیشده برای محافظت در برابر حملات تصادم به تابع هش استفادهشده در امضاهای دیجیتال مفید است.
هشسازی تصادفیسازیشده (randomized hashing) برای موقعیتهایی طراحی شده است که در آنها یک طرف، یعنی تهیهکننده پیام، تمام یا بخشی از یک پیام را تولید میکند تا توسط طرف دوم، یعنی امضاکننده پیام، امضا شود. اگر تهیهکننده پیام قادر به یافتن برخوردهای تابع هش رمزنگاری باشد (یعنی دو پیام که مقدار هش یکسانی تولید میکنند)، ممکن است نسخههای معناداری از پیام را تهیه کند که مقدار هش و امضای دیجیتال یکسانی تولید میکنند، اما نتایج متفاوتی دارند (برای مثال، انتقال ۱٬۰۰۰٬۰۰۰ دلار به یک حساب، بهجای ۱۰ دلار). توابع هش رمزنگاری با هدف اصلی مقاومت در برابر برخورد طراحی شدهاند، اما تمرکز کنونی بر حملات به توابع هش رمزنگاری ممکن است موجب شود که یک تابع هش رمزنگاری معین، مقاومت کمتری در برابر برخورد از حد انتظار داشته باشد. هشسازی تصادفیسازیشده با کاهش احتمال اینکه تهیهکننده بتواند دو یا چند پیام تولید کند که در نهایت در جریان فرآیند تولید امضای دیجیتال مقدار هش یکسانی را به دست میدهند، محافظت بیشتری برای امضاکننده فراهم میکند --- حتی اگر یافتن برخوردها برای تابع هش عملی باشد. با این حال، هنگامی که تمام بخشهای پیام توسط امضاکننده تهیه شده باشند، استفاده از هشسازی تصادفیسازیشده ممکن است میزان امنیت فراهمشده توسط امضای دیجیتال را کاهش دهد.
در BLAKE2، نمک (salt) بهعنوان یک ورودی یکباره برای تابع هش در حین مقداردهی اولیه پردازش میشود، نه بهعنوان ورودی برای هر تابع فشردهسازی.
هشدار
هش نمکدار (یا فقط هش) با BLAKE2 یا هر تابع هش رمزنگاری عمومی دیگری، مانند SHA-256، برای هش کردن گذرواژهها مناسب نیست. برای اطلاعات بیشتر BLAKE2 FAQ را ببینید.
>>> importos>>> fromhashlibimportblake2b>>> msg=b'some message'>>> # Calculate the first hash with a random salt.>>> salt1=os.urandom(blake2b.SALT_SIZE)>>> h1=blake2b(salt=salt1)>>> h1.update(msg)>>> # Calculate the second hash with a different random salt.>>> salt2=os.urandom(blake2b.SALT_SIZE)>>> h2=blake2b(salt=salt2)>>> h2.update(msg)>>> # The digests are different.>>> h1.digest()!=h2.digest()True
گاهی مفید است که تابع هش را وادار کنیم تا برای یک ورودی یکسان، چکیدههای متفاوتی را برای اهداف مختلف تولید کند. به نقل از نویسندگان تابع هش Skein:
توصیه میکنیم همهی طراحان برنامه بهجدی انجام این کار را در نظر بگیرند؛ ما پروتکلهای زیادی دیدهایم که در آنها هشی که در بخشی از پروتکل محاسبه میشود، میتواند در بخشی کاملاً متفاوت استفاده شود، زیرا دو محاسبهی هش روی دادههای مشابه یا مرتبط انجام شده است و مهاجم میتواند برنامه را مجبور کند ورودیهای هش را یکسان کند. شخصیسازی هر تابع هش استفادهشده در پروتکل، این نوع حمله را بهطور قاطع متوقف میسازد.
BLAKE2 توسط Jean-Philippe Aumasson، Samuel Neves، Zooko Wilcox-O'Hearn و Christian Winnerlein بر اساس BLAKE، فینالیست SHA-3، که توسط Jean-Philippe Aumasson، Luca Henzen، Willi Meier و Raphael C.-W. Phan ایجاد شده بود، طراحی شد.
این از الگوریتم اصلی رمز ChaCha استفاده میکند که توسط Daniel J. Bernstein طراحی شده است.
پیادهسازی کتابخانهی استاندارد بر اساس ماژول pyblake2 است. این پیادهسازی توسط Dmitry Chestnykh و بر اساس پیادهسازی C نوشتهشده توسط Samuel Neves نوشته شده است. مستندات از pyblake2 کپی شده و توسط Dmitry Chestnykh نوشته شده است.
کد C تا حدی برای پایتون توسط Christian Heimes بازنویسی شد.
وقفنامهی مالکیت عمومی زیر شامل پیادهسازی تابع هش C، کد توسعه، و این مستندات میشود:
تا حد امکان طبق قانون، نویسنده(ها) تمامی حق نشر و حقوق مرتبط و همسایه مربوط به این نرمافزار را به حوزه عمومی در سراسر جهان اختصاص دادهاند. این نرمافزار بدون هیچگونه ضمانتی توزیع میشود.
افراد زیر در توسعه کمک کردهاند یا تغییرات خود را به پروژه و مالکیت عمومی، مطابق با Creative Commons Public Domain Dedication 1.0 Universal، اهدا کردهاند:
آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC).
آیا اشکالی یافتید؟
ساخته شده با Sphinx 9.1.0.
You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.