هشینگ (Hashing) فرایندی است که داده ورودی را با یک تابع هش به خروجی با طول مشخص یا محدود تبدیل می‌کند. هدف تابع هش رمزنگاری مانند SHA-256 ساخت اثری انگشت‌مانند از داده است، نه تولید نسخه قابل بازیابی از متن اصلی. با تغییر یک بیت از ورودی، مقدار هش ممکن است کاملا متفاوت شود.

انواع الگوریتم‌های هش

الگوریتمکاربرد مناسبمحدودیت یا نکته امنیتی
MD5چک‌سام قدیمی فایل‌های غیرحساسبه دلیل حمله برخورد برای کاربرد رمزنگاری امن نیست
SHA-1سازگاری با سامانه‌های قدیمیبرای امضا و مقاومت در برابر برخورد منسوخ است
SHA-256 / SHA-512یکپارچگی داده، امضای دیجیتال و HMACبرای ذخیره مستقیم رمز عبور کافی نیست
SHA-3خانواده تابع هش با ساختار Keccakبسته به کاربرد و استاندارد انتخاب می‌شود
BLAKE2 / BLAKE3هش سریع فایل و دادهBLAKE3 الگوریتم هش است نه رمزنگاری برگشت‌پذیر
bcrypt / scrypt / Argon2idهش رمز عبوربرای کندسازی حمله حدس رمز، Salt و پارامتر هزینه مناسب لازم است

تفاوت هشینگ، انکودینگ و انکریپشن

در انکودینگ می‌توان داده را با دانستن قالب دوباره دیکودینگ کرد، مثلا Base64 هیچ رازی را پنهان نمی‌کند. در Encryption هدف محرمانگی با یک کلید است و در صورت داشتن کلید می‌توان متن را بازیابی کرد. اما هش رمزنگاری به‌صورت معمول قابلیت معکوس‌سازی ندارد. البته حملات حدس و جدول‌های آماده روی ورودی‌های ضعیف هنوز ممکن‌اند.

نکته امنیتی

برای رمز عبور از password_hash در PHP و Argon2id یا bcrypt در زبان‌های دیگر استفاده کنید. ذخیره SHA-256 ساده برای رمز عبور، حتی همراه با Salt، جای یک KDF مخصوص رمز عبور را نمی‌گیرد.

نمونه در PHP

$text = 'order:12345';
echo hash('sha256', $text);
$stored = password_hash($password, PASSWORD_ARGON2ID);
if (password_verify($password, $stored)) { /* authenticated */ }

نمونه در پایتون

import hashlib
print(hashlib.sha256(b'order:12345').hexdigest())
# Passwords: use argon2-cffi or another vetted KDF

نمونه در Go

package main
import ("crypto/sha256"; "fmt")
func main() {
 sum := sha256.Sum256([]byte("order:12345"))
 fmt.Printf("%x\n", sum)
}

نمونه در C# و ASP.NET Core

using System.Security.Cryptography;
using System.Text;
string value = Convert.ToHexString(
    SHA256.HashData(Encoding.UTF8.GetBytes("order:12345")));
// For passwords, use PasswordHasher<TUser> in ASP.NET Identity.

اگر می‌خواهید تفاوت کاربردها را دقیق‌تر ببینید، صفحات انکودینگ، دیکودینگ و رمزنگاری داده را بخوانید.