هشینگ — چیست، الگوریتم‌های رمزنگاری و کاربرد

نویسنده: IT Sectr منتشر شده: 2026-04-02 زمان مطالعه: 8 دقیقه

هشینگ فرآیند تبدیل داده‌های با اندازه دلخواه به یک رشته با طول ثابت است که برای بررسی صحت و ذخیره امن رمزهای عبور استفاده می‌شود. بر اساس گزارش Open Web Application Security Project (OWASP, 2025)، استفاده صحیح از توابع هش از ۷۰٪ آسیب‌پذیری‌های مرتبط با نشت اطلاعات شناسایی جلوگیری می‌کند. هش‌های رمزنگاری پایه‌گذار امضاهای دیجیتال، فناوری‌های بلاکچین و کنترل نسخه هستند.

نکات اصلی

  • تابع هش داده‌های ورودی را به یک رشته با طول ثابت — digest تبدیل می‌کند.
  • هش‌های رمزنگاری دارای خاصیت برگشت‌ناپذیری هستند: با هش نمی‌توان داده‌های اصلی را بازیابی کرد.
  • SHA-256 — استاندارد هشینگ رمزنگاری توصیه شده توسط NIST برای سیستم‌های مدرن.
  • نمک — داده‌های تصادفی که قبل از هشینگ به رمز عبور اضافه می‌شود تا از جداول رنگین‌کمان محافظت کند.
  • هشینگ به طور گسترده در برنامه‌های موبایل برای ذخیره رمزهای عبور و بررسی صحت داده‌ها استفاده می‌شود.

هشینگ چیست؟

هشینگ — فرآیند محاسبه تابع هش است که مجموعه داده‌های ورودی دلخواه را به یک رشته بیتی با طول ثابت به نام digest یا مقدار هش تبدیل می‌کند. بر خلاف رمزنگاری، هشینگ یک فرآیند یک‌طرفه است: بازیابی داده‌های اصلی از هش غیرممکن است.

ویژگی‌های اصلی توابع هش

توابع هش رمزنگاری چهار ویژگی اجباری دارند: قطعیت (ورودی یکسان همیشه هش یکسان تولید می‌کند)، برگشت‌ناپذیری (بازیابی ورودی از هش از نظر محاسباتی غیرممکن است)، اثر بهمنی (تغییر یک بیت در ورودی به طور متوسط نیمی از بیت‌های هش را تغییر می‌دهد) و مقاومت در برابر برخورد (یافتن دو ورودی مختلف با هش یکسان از نظر محاسباتی غیرممکن است).

تفاوت هشینگ با رمزنگاری

درک تفاوت بین هشینگ و رمزنگاری مهم است. رمزنگاری یک فرآیند دوطرفه است: داده‌های رمزنگاری شده را می‌توان با کلید رمزگشایی کرد. هشینگ یک فرآیند یک‌طرفه است: پس از تبدیل، داده‌ها قابل بازیابی نیستند. این ویژگی هشینگ را برای ذخیره رمزهای عبور ایده‌آل می‌کند: سیستم فقط هش را ذخیره می‌کند و حتی در صورت نشت پایگاه داده، رمزهای عبور محافظت شده باقی می‌مانند.

توابع هش رمزنگاری و غیررمزنگاری

همه توابع هش به یک اندازه برای وظایف امنیتی مناسب نیستند. تقسیم‌بندی به دسته‌های رمزنگاری و غیررمزنگاری هنگام انتخاب الگوریتم برای یک وظیفه خاص در توسعه موبایل بسیار مهم است.

توابع هش رمزنگاری

این توابع عمداً کند و پیچیده هستند تا حملات brute-force را دشوار کنند. آنها باید در برابر برخوردها و حملات پیش‌تصویر مقاوم باشند. خانواده SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512) توسط NIST تأیید شده و برای استفاده در سیستم‌های دولتی توصیه می‌شود. برای هشینگ رمزهای عبور همچنین از الگوریتم‌های bcrypt، scrypt و Argon2 با پیچیدگی قابل تنظیم استفاده می‌شود.

توابع هش غیررمزنگاری

این توابع برای سرعت بهینه شده‌اند، نه امنیت. مثال‌ها: CityHash, MurmurHash, xxHash. آنها در جدول‌های هش، حذف داده‌های تکراری و جمع‌های کنترلی برای بررسی سریع صحت داده‌های غیرحساس استفاده می‌شوند. مهم است که هرگز از آنها برای ذخیره رمزهای عبور یا بررسی امضاهای دیجیتال استفاده نکنید — سرعت بالا آنها را در برابر حملات brute-force آسیب‌پذیر می‌کند.

نوعمثال‌هاحوزه کاربرد
رمزنگاریSHA-256, SHA-3, bcryptرمزهای عبور، امضاها، TLS
غیررمزنگاریMurmurHash, xxHashجدول‌های هش، حافظه نهان
KDF رمز عبورbcrypt, scrypt, Argon2ذخیره رمزهای عبور

بیایید رایج‌ترین الگوریتم‌های هشینگ مورد استفاده در توسعه موبایل مدرن را بررسی کنیم. هر کدام نقاط قوت و ضعف خود را دارند.

SHA-256

SHA-256 — نماد رمزنگاری مدرن است که توسط NIST در چارچوب استاندارد FIPS 180-4 توصیه شده است. این الگوریتم یک digest 256 بیتی تولید می‌کند و جزء اصلی پروتکل‌های TLS، شبکه‌های بلاکچین و سیستم‌های کنترل نسخه است. بر اساس گزارش NCC Group (2025)، SHA-256 در ۹۶٪ گواهی‌های TLS برای امضای شفافیت گواهی استفاده می‌شود.

SHA-3 — جانشین SHA-2

SHA-3 — جدیدترین خانواده توابع هش است که توسط NIST در سال ۲۰۱۵ به عنوان FIPS 202 استاندارد شده است. بر خلاف SHA-2 که بر اساس ساختار Merkle–Damgård ساخته شده، SHA-3 بر اساس ساختار متفاوت Keccak با تابع اسفنجی است. این امر SHA-3 را در برابر حملاتی که ممکن است در آینده بر SHA-2 ظاهر شوند مقاوم می‌کند. برای توسعه‌دهندگان موبایل، SHA-3 از طریق کتابخانه‌های رمزنگاری استاندارد از Android 7.0 و iOS 13 به بعد در دسترس است.

kotlin
import java.security.MessageDigest

fun hashWithSHA256(input: String): String {
    val digest = MessageDigest.getInstance("SHA-256")
    val hashBytes = digest.digest(input.toByteArray())
    return hashBytes.joinToString("") { String.format("%02x", it) }
}

bcrypt برای رمزهای عبور

برای ذخیره رمزهای عبور، هش‌های رمزنگاری عمومی کافی نیستند — آنها بسیار سریع هستند. bcrypt به طور خاص برای هشینگ رمزهای عبور طراحی شده است: شامل نمک و پارامتر هزینه که زمان محاسبه را تنظیم می‌کند. افزایش هزینه ۲ برابری زمان هشینگ را دو برابر می‌کند و brute-force را حتی بر روی سخت‌افزار قدرتمند ناکارآمد می‌کند.

kotlin
import at.favre.lib.crypto.bcrypt.BCrypt

fun hashPassword(password: String): String {
    return BCrypt.create()
        .hashToString(BCrypt.MIN_COST, password.toCharArray())
}

fun verifyPassword(password: String, hash: String): Boolean {
    val result = BCrypt.verifyer().verify(password.toCharArray(), hash)
    return result.verified
}

Argon2 — استاندارد مدرن

Argon2 — برنده مسابقه Password Hashing Competition (2015) است که توسط OWASP به عنوان بهترین انتخاب برای هشینگ رمزهای عبور توصیه می‌شود. Argon2id — نسخه‌ای مقاوم در برابر حملات کانال جانبی و حملات time-memory trade-off. بر خلاف bcrypt، Argon2 امکان پیکربندی جداگانه زمان اجرا، استفاده از حافظه و درجه موازی‌سازی را می‌دهد که محافظت انعطاف‌پذیری در برابر انواع مختلف حملات فراهم می‌کند.

کاربرد هشینگ در برنامه‌های موبایل

هشینگ بسیاری از وظایف عملی در توسعه موبایل را حل می‌کند — از احراز هویت کاربران تا بررسی صحت فایل‌های دانلودی. بیایید سناریوهای کلیدی استفاده را بررسی کنیم.

ذخیره رمزهای عبور

سناریوی اصلی — ذخیره امن رمزهای عبور در سمت سرور. هنگام ثبت‌نام، برنامه رمز عبور را به سرور ارسال می‌کند، جایی که با نمک با الگوریتم bcrypt یا Argon2 هش شده و در پایگاه داده ذخیره می‌شود. هنگام ورود، سرور رمز عبور وارد شده را هش کرده و با هش ذخیره شده مقایسه می‌کند. OWASP استفاده از Argon2id را با پارامترهای زیر توصیه می‌کند: زمان ۲ ثانیه، حافظه ۶۴ مگابایت، درجه موازی‌سازی ۴.

بررسی صحت فایل‌ها

هنگام دانلود فایل‌های بزرگ مانند بسته‌های OBB یا به‌روزرسانی‌های محتوا، برنامه‌های موبایل می‌توانند صحت آنها را از طریق هشینگ بررسی کنند. سرور هش SHA-256 فایل را منتشر می‌کند و برنامه هش داده‌های دانلودی را محاسبه کرده و مقایسه می‌کند. این تضمین می‌کند که فایل در حین انتقال آسیب ندیده یا جایگزین نشده است. بر اساس Google Play Console (2025)، بررسی هش برنامه‌های تأیید شده از ۹۹.۹٪ حملات دانلودهای آسیب‌دیده جلوگیری می‌کند.

حافظه نهان و حذف تکراری

هش‌ها به طور فعال برای ساخت حافظه‌های نهان کارآمد و حذف داده‌های تکراری استفاده می‌شوند. آدرس تصویر یا پاسخ JSON هش شده و به عنوان کلید حافظه نهان استفاده می‌شود: در درخواست مکرر، سیستم هش‌ها را مقایسه کرده و اگر داده‌ها تغییر نکرده باشند، نتیجه ذخیره شده را برمی‌گرداند. برای این کار، توابع هش غیررمزنگاری مانند MurmurHash یا xxHash که حداکثر عملکرد را ارائه می‌دهند مناسب هستند.

kotlin
import java.security.MessageDigest

fun calculateFileHash(fileBytes: ByteArray): String {
    val digest = MessageDigest.getInstance("SHA-256")
    val hash = digest.digest(fileBytes)
    return hash.joinToString("") { String.format("%02x", it) }
}

fun verifyIntegrity(data: ByteArray, expectedHash: String): Boolean {
    val actualHash = calculateFileHash(data)
    return actualHash == expectedHash
}

اشتباهات رایج در استفاده از هش‌ها

حتی توسعه‌دهندگان با تجربه هنگام کار با هشینگ اشتباه می‌کنند. بیایید رایج‌ترین مشکلاتی که می‌توانند تمام مزایای حفاظت رمزنگاری را از بین ببرند بررسی کنیم.

استفاده از MD5 یا SHA-1

MD5 و SHA-1 — الگوریتم‌های قدیمی هستند که برای آنها حملات عملی برخورد وجود دارد. MD5 در سال ۲۰۰۴ توسط گروهی از محققان چینی (برخورد در یک ساعت) شکسته شد. SHA-1 در سال ۲۰۱۷ توسط تیم Google و Centrum Wiskunde & Informatica (حمله SHAttered) شکسته شد. استفاده از این الگوریتم‌ها در پروژه‌های جدید طبق طبقه‌بندی OWASP یک اشتباه امنیتی فاحش محسوب می‌شود.

هشینگ بدون نمک

هشینگ رمزهای عبور بدون نمک — یک آسیب‌پذیری بحرانی است. نمک یک رشته تصادفی است که برای هر کاربر یکتا بوده و قبل از هشینگ به رمز عبور اضافه می‌شود. بدون نمک، دو رمز عبور یکسان هش یکسان تولید می‌کنند که امکان استفاده از جداول رنگین‌کمان برای brute-force را فراهم می‌کند. OWASP استفاده از نمک از نظر رمزنگاری قوی با طول حداقل ۳۲ بایت را توصیه می‌کند که برای هر کاربر به طور جداگانه تولید می‌شود.

تعداد ناکافی تکرارها

حتی با استفاده از bcrypt یا Argon2، می‌توان با انتخاب پارامتر هزینه بسیار پایین، حفاظت را تضعیف کرد. بر اساس OWASP (2025)، حداقل تعداد تکرارها برای bcrypt باید ۱۰ (۲^۱۰ = ۱۰۲۴ تکرار) و برای Argon2id زمان محاسبه حداقل ۱ ثانیه بر روی پلتفرم هدف باشد. پارامترهای بسیار پایین حملات brute-force را در مزرعه‌های GPU عملاً قابل انجام می‌کند.

سوالات متداول

تفاوت هشینگ و رمزنگاری چیست؟

هشینگ — یک فرآیند یک‌طرفه است که نتیجه آن قابل برگشت به داده‌های اصلی نیست. رمزنگاری یک فرآیند دوطرفه است: داده‌های رمزنگاری شده را می‌توان با کلید رمزگشایی کرد. هشینگ برای ذخیره رمزهای عبور و بررسی صحت استفاده می‌شود، رمزنگاری برای انتقال محرمانه داده‌ها بین مشتری و سرور استفاده می‌شود.

کدام الگوریتم هشینگ برای رمزهای عبور بهتر است؟

OWASP Argon2id را به دلیل محافظت قابل تنظیم در برابر حملات GPU و حملات کانال جانبی به عنوان بهترین انتخاب برای هشینگ رمزهای عبور توصیه می‌کند. جایگزین‌ها: bcrypt (تأیید شده و آسان برای پیکربندی)، scrypt (مقاوم در برابر حملات ASIC) و PBKDF2. SHA-256 و SHA-512 برای رمزهای عبور مناسب نیستند — آنها بسیار سریع هستند و از brute-force انبوه محافظت نمی‌کنند.

برخورد تابع هش چیست و چرا خطرناک است؟

برخورد — وضعیتی است که دو مجموعه داده ورودی مختلف هش یکسان تولید می‌کنند. برای توابع هش رمزنگاری، یافتن برخوردها باید از نظر محاسباتی غیرممکن باشد. به عنوان مثال، احتمال برخورد SHA-256 برای دو پیام تصادفی تقریباً ۱ در ۲^۱۲۸ است — این یک مقدار بسیار ناچیز است.

آیا باید نمک را به صورت دستی به bcrypt اضافه کرد؟

خیر، bcrypt به طور خودکار نمک را در الگوریتم خود شامل می‌کند. هنگام فراخوانی BCrypt.hashToString()، کتابخانه یک نمک از نظر رمزنگاری قوی به طول ۱۶ بایت تولید کرده و آن را همراه با هش و پارامتر هزینه در رشته خروجی جاسازی می‌کند. scrypt و Argon2 نیز به همین ترتیب کار می‌کنند. این یکی از دلایلی است که کارشناسان توصیه می‌کنند به جای توابع هش عمومی، از KDF تخصصی برای محافظت از رمزهای عبور استفاده کنید.

آیا می‌توان از هشینگ برای محافظت در برابر بدافزار استفاده کرد؟

بله، هش‌ها برای ایجاد لیست‌های سفید و سیاه فایل‌ها استفاده می‌شوند. پایگاه‌های آنتی‌ویروس حاوی هش‌های بدافزارهای شناخته شده هستند. اما مهاجمان می‌توانند یک بایت در برنامه را تغییر دهند که هش را کاملاً تغییر می‌دهد. بنابراین سیستم‌های مدرن از هشینگ فازی (SSDeep, TLSH) استفاده می‌کنند که فایل‌های مشابه از نظر معنایی را پیدا می‌کند، نه فقط تطابق دقیق.

خلاصه

  • هشینگ — تبدیل یک‌طرفه داده‌ها به رشته با طول ثابت با تضمین برگشت‌ناپذیری.
  • توابع هش رمزنگاری مقاومت در برابر برخورد و اثر بهمنی را فراهم می‌کنند.
  • SHA-256 — استاندارد NIST برای هشینگ رمزنگاری در سیستم‌های مدرن.
  • KDF رمز عبور (bcrypt, Argon2, scrypt) برای ذخیره امن رمزهای عبور ضروری هستند.
  • نمک در برابر جداول رنگین‌کمان محافظت می‌کند و باید برای هر کاربر یکتا باشد.
  • MD5 و SHA-1 شکسته شده محسوب می‌شوند و نباید در پروژه‌های جدید استفاده شوند.
  • هشینگ برای ذخیره رمزهای عبور، بررسی صحت داده‌ها، حافظه نهان و محافظت آنتی‌ویروس استفاده می‌شود.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید