هشینگ فرآیند تبدیل دادههای با اندازه دلخواه به یک رشته با طول ثابت است که برای بررسی صحت و ذخیره امن رمزهای عبور استفاده میشود. بر اساس گزارش Open Web Application Security Project (OWASP, 2025)، استفاده صحیح از توابع هش از ۷۰٪ آسیبپذیریهای مرتبط با نشت اطلاعات شناسایی جلوگیری میکند. هشهای رمزنگاری پایهگذار امضاهای دیجیتال، فناوریهای بلاکچین و کنترل نسخه هستند.
نکات اصلی
هشینگ — فرآیند محاسبه تابع هش است که مجموعه دادههای ورودی دلخواه را به یک رشته بیتی با طول ثابت به نام 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 — نماد رمزنگاری مدرن است که توسط NIST در چارچوب استاندارد FIPS 180-4 توصیه شده است. این الگوریتم یک digest 256 بیتی تولید میکند و جزء اصلی پروتکلهای TLS، شبکههای بلاکچین و سیستمهای کنترل نسخه است. بر اساس گزارش NCC Group (2025)، SHA-256 در ۹۶٪ گواهیهای TLS برای امضای شفافیت گواهی استفاده میشود.
SHA-3 — جدیدترین خانواده توابع هش است که توسط NIST در سال ۲۰۱۵ به عنوان FIPS 202 استاندارد شده است. بر خلاف SHA-2 که بر اساس ساختار Merkle–Damgård ساخته شده، SHA-3 بر اساس ساختار متفاوت Keccak با تابع اسفنجی است. این امر SHA-3 را در برابر حملاتی که ممکن است در آینده بر SHA-2 ظاهر شوند مقاوم میکند. برای توسعهدهندگان موبایل، SHA-3 از طریق کتابخانههای رمزنگاری استاندارد از Android 7.0 و iOS 13 به بعد در دسترس است.
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 به طور خاص برای هشینگ رمزهای عبور طراحی شده است: شامل نمک و پارامتر هزینه که زمان محاسبه را تنظیم میکند. افزایش هزینه ۲ برابری زمان هشینگ را دو برابر میکند و brute-force را حتی بر روی سختافزار قدرتمند ناکارآمد میکند.
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 — برنده مسابقه 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 که حداکثر عملکرد را ارائه میدهند مناسب هستند.
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 در سال ۲۰۱۷ توسط تیم 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.hashToString()، کتابخانه یک نمک از نظر رمزنگاری قوی به طول ۱۶ بایت تولید کرده و آن را همراه با هش و پارامتر هزینه در رشته خروجی جاسازی میکند. scrypt و Argon2 نیز به همین ترتیب کار میکنند. این یکی از دلایلی است که کارشناسان توصیه میکنند به جای توابع هش عمومی، از KDF تخصصی برای محافظت از رمزهای عبور استفاده کنید.
بله، هشها برای ایجاد لیستهای سفید و سیاه فایلها استفاده میشوند. پایگاههای آنتیویروس حاوی هشهای بدافزارهای شناخته شده هستند. اما مهاجمان میتوانند یک بایت در برنامه را تغییر دهند که هش را کاملاً تغییر میدهد. بنابراین سیستمهای مدرن از هشینگ فازی (SSDeep, TLSH) استفاده میکنند که فایلهای مشابه از نظر معنایی را پیدا میکند، نه فقط تطابق دقیق.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید