هشینگ (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.
اگر میخواهید تفاوت کاربردها را دقیقتر ببینید، صفحات انکودینگ، دیکودینگ و رمزنگاری داده را بخوانید.