در دنیای دیجیتال امروز، احراز هویت با کد ملی به یکی از مهمترین و رایجترین روشهای تأیید هویت کاربران ایرانی تبدیل شده است. از سامانههای دولتی مثل ثبتاحوال و سازمان امور مالیاتی گرفته تا بانکها، بیمهها، فروشگاههای اینترنتی و استارتاپهای نوپا، همه و همه به دنبال یک راه مطمئن برای تأیید هویت کاربر ایرانی هستند.
اما سوال اصلی اینجاست: چطور میتوان یک سیستم احراز هویت با کد ملی را هم امن، هم سریع و هم قانونی پیادهسازی کرد؟ در این راهنمای جامع، تمام چیزهایی که باید بدانید را از صفر تا صد توضیح میدهیم.
قبل از هر چیز باید بدانید که کد ملی ایران یک عدد ۱۰ رقمی است که توسط سازمان ثبت احوال کشور به هر شهروند ایرانی اختصاص داده میشود. این عدد یک ساختار منطقی دارد که میتوان آن را به صورت الگوریتمیک اعتبارسنجی کرد.
رقم کنترلی مهمترین بخش اعتبارسنجی کد ملی است. با استفاده از یک الگوریتم ریاضی ساده میتوان فهمید آیا یک کد ملی از نظر فرمت صحیح است یا خیر. البته توجه داشته باشید که اعتبارسنجی فرمت کد ملی با تأیید هویت واقعی کاربر دو چیز کاملاً متفاوت هستند.
برای بررسی اینکه آیا یک کد ملی از نظر فرمت درست است، مراحل زیر را دنبال کنید:
نه رقم اول را از راست به چپ در اعداد ۲ تا ۱۰ ضرب کنید، حاصلها را با هم جمع کنید، باقیمانده تقسیم بر ۱۱ را به دست آورید. اگر باقیمانده کمتر از ۲ باشد، باید با رقم دهم برابر باشد. اگر باقیمانده بیشتر یا مساوی ۲ باشد، عدد ۱۱ منهای باقیمانده باید با رقم دهم برابر باشد.
// JavaScript - اعتبارسنجی کد ملی ایران
function validateNationalCode(code) {
// بررسی طول و عددی بودن
if (!/^\d{10}$/.test(code)) return false;
// بررسی ارقام تکراری
if (/^(\d)\1{9}$/.test(code)) return false;
// محاسبه رقم کنترلی
let sum = 0;
for (let i = 0; i < 9; i++) {
sum += parseInt(code[i]) * (10 - i);
}
const remainder = sum % 11;
const checkDigit = parseInt(code[9]);
if (remainder < 2) {
return checkDigit === remainder;
} else {
return checkDigit === (11 - remainder);
}
}
// مثال استفاده
console.log(validateNationalCode(“0012345678”)); // true یا false
Python - اعتبارسنجی کد ملی ایران
import re
def validate_national_code(code: str) -> bool:
بررسی طول و عددی بودن
if not re.match(r’^\d{10}$', code):
return False
بررسی ارقام تکراری
if len(set(code)) == 1:
return False
محاسبه رقم کنترلی
total = sum(int(code[i]) * (10 - i) for i in range(9))
remainder = total % 11
check_digit = int(code[9])
if remainder < 2:
return check_digit == remainder
else:
return check_digit == (11 - remainder)
تست
print(validate_national_code(“0012345678”))
اعتبارسنجی فرمت فقط اولین قدم است. برای یک سیستم احراز هویت واقعی، باید هویت کاربر را به شکل مطمئنتری تأیید کنید. در ایران چند روش رایج وجود دارد:
رایجترین روش در ایران. کاربر کد ملی و شماره موبایل خود را وارد میکند. سیستم یک رمز یکبارمصرف (OTP) به شماره ثبتشده در بانک اطلاعاتی ثبت احوال ارسال میکند. این روش نسبتاً امن است اما به اتصال با پایگاه داده ثبت احوال نیاز دارد.
سامانه شاهکار یک سرویس ملی است که توسط سازمان تنظیم مقررات و ارتباطات رادیویی (رگولاتوری) ارائه میشود و امکان تطابق کد ملی با شماره موبایل را فراهم میکند. بسیاری از کسبوکارهای آنلاین از این سرویس برای احراز هویت استفاده میکنند.
در این روش، کاربر از طریق رمز دوم پویا (3D Secure) با کارت بانکی خود احراز هویت میکند. از آنجا که کارتهای بانکی به کد ملی متصل هستند، این روش میتواند به عنوان تأیید هویت غیرمستقیم استفاده شود.
eKYC (احراز هویت الکترونیک) یا همان کیوایسی آنلاین روزبهروز در ایران محبوبتر میشود. در این روش از ترکیب کد ملی، عکس کارت ملی، سلفی و تشخیص چهره برای تأیید هویت استفاده میشود. شرکتهایی مثل جیبیت، مصباحنت و سایر سرویسدهندگان eKYC این خدمات را ارائه میدهند.
یک سیستم احراز هویت حرفهای با کد ملی باید لایههای زیر را داشته باشد:
db=
this−>db=
db;
}
// اعتبارسنجی فرمت کد ملی
public function validateFormat(string $code): bool {
if (!preg_match('/^\d{10}
/′,
/
′
,
code)) return false;
if (preg_match('/^(\d)\1{9}
/′,
/
′
,
code)) return false;
$sum = 0;
for (
i=0;
i=0;
i < 9; $i++) {
sum+=(int)
sum+=(int)
code[
i]∗(10−
i]∗(10−
i);
}
remainder=
remainder=
sum % 11;
checkDigit=(int)
checkDigit=(int)
code[9];
return $remainder < 2
?
checkDigit===
checkDigit===
remainder
:
checkDigit===(11−
checkDigit===(11−
remainder);
}
// ارسال OTP
public function sendOTP(string
nationalCode,string
nationalCode,string
mobile): array {
if (!
this−>validateFormat(
this−>validateFormat(
nationalCode)) {
return [‘success’ => false, ‘message’ => ‘کد ملی نامعتبر است’];
}
// بررسی تعداد تلاشها (Rate Limiting)
if (
this−>checkRateLimit(
this−>checkRateLimit(
nationalCode)) {
return [‘success’ => false, ‘message’ => ‘تعداد تلاشها بیش از حد مجاز است’];
}
$otp = random_int(100000, 999999);
hashedOtp=passwordhash(
hashedOtp=password
h
ash(
otp, PASSWORD_BCRYPT);
expiry=time()+
expiry=time()+
this->otpExpiry;
// ذخیره OTP در دیتابیس
stmt=
stmt=
this->db->prepare(
"INSERT INTO otp_tokens (national_code, mobile, token_hash, expires_at, created_at)
VALUES (?, ?, ?, ?, NOW())"
);
stmt−>execute([
stmt−>execute([
nationalCode,
mobile,
mobile,
hashedOtp, $expiry]);
// ارسال پیامک (اتصال به سرویس SMS)
this−>sendSMS(
this−>sendSMS(
mobile, “کد تأیید شما: {$otp} - این کد ۲ دقیقه اعتبار دارد.”);
return [‘success’ => true, ‘message’ => ‘کد تأیید ارسال شد’];
}
// تأیید OTP
public function verifyOTP(string
nationalCode,string
nationalCode,string
otp): array {
stmt=
stmt=
this->db->prepare(
"SELECT * FROM otp_tokens
WHERE national_code = ? AND expires_at > UNIX_TIMESTAMP() AND used = 0
ORDER BY created_at DESC LIMIT 1"
);
stmt−>execute([
stmt−>execute([
nationalCode]);
record=
record=
stmt->fetch(PDO::FETCH_ASSOC);
if (!
record∣∣!passwordverify(
record∣∣!password
v
erify(
otp, $record[‘token_hash’])) {
return [‘success’ => false, ‘message’ => ‘کد وارد شده نامعتبر یا منقضی شده است’];
}
// علامتگذاری به عنوان استفادهشده
$this->db->prepare(“UPDATE otp_tokens SET used = 1 WHERE id = ?”)
->execute([$record[‘id’]]);
return [‘success’ => true, ‘message’ => ‘احراز هویت موفق’];
}
private function checkRateLimit(string $nationalCode): bool {
stmt=
stmt=
this->db->prepare(
"SELECT COUNT(*) FROM otp_tokens
WHERE national_code = ? AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)"
);
stmt−>execute([
stmt−>execute([
nationalCode]);
return
stmt−>fetchColumn()>=
stmt−>fetchColumn()>=
this->maxAttempts;
}
}
?>
آیا میخواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگخورهایتان چند برابر شود؟ سئوی سایت خود را به متخصصان ما بسپارید و شاهد رشد کسبوکارتان باشید!
📞 همین حالا برای مشاوره رایگان تماس بگیرید:
09190994063 | 09376846692
امنیت در سیستمهای احراز هویت هیچوقت نباید فدای سرعت توسعه شود. اگر از اطلاعات هویتی کاربران محافظت نکنید، با مشکلات قانونی جدی مواجه خواهید شد. این نکات را حتماً رعایت کنید:
کد ملی از جمله اطلاعات شخصی حساس است. طبق قوانین حریم خصوصی ایران و قوانین جهانی حفاظت از داده، باید این اطلاعات را رمزنگاری (Encrypt) کنید، نه Hash. زیرا ممکن است بعداً به آن نیاز داشته باشید اما باید کاملاً محافظتشده باشد.
بدون Rate Limiting، هکرها میتوانند با Brute Force کد ملیهای مختلف را امتحان کنند. حداقل ۳ تلاش در ۱۰ دقیقه را به عنوان محدودیت تعریف کنید و IP متخلف را موقتاً Block کنید.
هیچوقت سیستم احراز هویت را روی HTTP راهاندازی نکنید. استفاده از SSL/TLS در این بخش اجباری است و گوگل هم سایتهای HTTP را در رتبهبندی تنزل میدهد.
کدهای OTP نباید بیشتر از ۲ تا ۵ دقیقه اعتبار داشته باشند. بعد از استفاده هم باید فوراً غیرفعال شوند تا از Replay Attack جلوگیری شود.
تمام تلاشهای احراز هویت (موفق و ناموفق) را همراه با IP، زمان، User-Agent و نتیجه ذخیره کنید. این اطلاعات هم برای امنیت و هم برای رفع اشکال حیاتی هستند.
در ایران، استفاده از کد ملی در سیستمهای نرمافزاری تابع قوانین و مقررات مشخصی است که نادیده گرفتن آنها میتواند عواقب جدی داشته باشد:
اگر نمیخواهید از صفر شروع کنید، میتوانید از فریمورکها و پکیجهای آماده استفاده کنید:
هرگز از APIهای غیررسمی برای استعلام کد ملی استفاده نکنید. سرویسهایی که ادعا میکنند بدون مجوز رسمی میتوانند کد ملی را در پایگاه داده ثبت احوال چک کنند، یا غیرقانونی هستند یا اطلاعات جعلی میدهند. علاوه بر خطرات قانونی، ممکن است اطلاعات کاربران شما را هم به خطر بیندازند.
همانطور که یک سیستم احراز هویت خوب نیاز به متخصص دارد، سئوی سایت شما هم باید در دست افراد باتجربه باشد. تیم ما با صدها پروژه موفق در ایران، میتوانند سایت شما را به صفحه اول گوگل برسانند و فروشتان را چند برابر کنند.
📞 مشاوره رایگان: 09190994063 | 09376846692
| روش | امنیت | سهولت | هزینه | مناسب برای |
|---|---|---|---|---|
| OTP + کد ملی | متوسط | زیاد | کم | اکثر سایتها |
| شاهکار | زیاد | متوسط | متوسط | بانک، بیمه، فینتک |
| eKYC | بسیار زیاد | کم | زیاد | بانکها، کریپتو |
| درگاه بانکی | زیاد | زیاد | متوسط | فروشگاههای آنلاین |
خیر. اعتبارسنجی فرمت کد ملی فقط نشان میدهد که یک کد از نظر ریاضی صحیح است، نه اینکه متعلق به شخص خاصی است. برای تأیید هویت واقعی باید از سرویسهای رسمی مثل شاهکار، ثبت احوال یا eKYC استفاده کنید.
برای دسترسی به سامانه شاهکار باید با سازمان تنظیم مقررات و ارتباطات رادیویی (رگولاتوری) قرارداد ببندید. این سرویس برای کسبوکارهای ثبتشده در ایران قابل دسترسی است. با دفاتر ارائهدهنده خدمات این سامانه تماس بگیرید.
طبق الزامات مرکز داده ملی ایران و قوانین داخلی، کسبوکارهای ایرانی باید اطلاعات شخصی کاربران ایرانی را در سرورهای داخل کشور نگهداری کنند. نقض این قانون میتواند عواقب قانونی جدی داشته باشد.
ترکیب Rate Limiting (محدودیت تعداد تلاش)، CAPTCHA (بعد از چند تلاش ناموفق)، IP Blocking موقت و ثبت لاگ جامع بهترین لایههای دفاعی هستند. علاوه بر این، استفاده از HTTPS و رمزنگاری دادهها الزامی است.
اشخاص حقوقی کد ملی ندارند؛ آنها دارای شناسه ملی ۱۱ رقمی هستند که توسط سازمان ثبت اسناد صادر میشود. الگوریتم اعتبارسنجی شناسه ملی اشخاص حقوقی با کد ملی اشخاص حقیقی متفاوت است.
خیر، کد ملی به تنهایی به اطلاعات شخصی فرد دسترسی نمیدهد. برای استعلام مشخصات، به دسترسی مستقیم به پایگاه داده ثبت احوال از طریق مجوز رسمی نیاز دارید. هرگونه ابزار یا سایتی که بدون مجوز این کار را میکند، غیرقانونی است.
در مورد استفاده از سرویس شاهکار، آیا کسبوکارهای کوچک هم میتوانند درخواست مجوز بدهند یا فقط برای شرکتهای بزرگ است؟ مراحل اخذ مجوز چقدر زمان میبرد؟
دسترسی به سامانه شاهکار نیازمند قرارداد با رگولاتوری است و عموماً برای کسبوکارهای ثبتشده امکانپذیر است. جزئیات و زمانبندی دقیق را باید از سازمان تنظیم مقررات و ارتباطات رادیویی یا دفاتر ارائهدهنده خدمات مربوطه پیگیری کنید. برای اطلاعات بیشتر در خصوص سیستمهای احراز هویت، با ما در تماس باشید: 09190994063 | 09376846692
مطالب مربوط به سئو که در پایان مقاله ذکر شد، چقدر در کنار یک سیستم احراز هویت قوی اهمیت دارد؟ آیا برای وبسایتهایی که خدمات آنلاین ارائه میدهند، سئو یک بخش جداییناپذیر است؟
بله، سئو و یک سیستم احراز هویت قوی هر دو از ارکان اصلی موفقیت یک وبسایت خدماتی آنلاین هستند. یک سیستم احراز هویت قوی اعتماد کاربر را جلب میکند، در حالی که سئو به شما کمک میکند تا کاربران بیشتری وبسایت شما را پیدا کنند. بدون دیده شدن، بهترین سیستم احراز هویت هم کارایی لازم را نخواهد داشت. تیم ما میتواند در این زمینه به شما کمک کند: 09190994063 | 09376846692
ممنون از راهنمایی جامع و کاملتون! خیلی مفید بود، مخصوصاً قسمت الگوریتم اعتبارسنجی کد ملی. واقعاً به دردبخور بود.
خوشحالیم که این راهنما برای شما مفید بوده است. برای هرگونه سوال بیشتر در خصوص پیادهسازی سیستمهای احراز هویت یا خدمات سئو، میتوانید با ما تماس بگیرید: 09190994063 | 09376846692
کد پایتون برای اعتبارسنجی کد ملی عالی بود. فقط یک سوال، اگر کد ملی با صفر شروع شود (مثل 0012345678)، آیا مشکلی پیش نمیآید و الگوریتم به درستی کار میکند؟
بله، الگوریتم ارائه شده هم در پایتون و هم در جاوااسکریپت، با کدهای ملی که با صفر شروع میشوند نیز به درستی کار میکند، زیرا به هر حال به عنوان یک رشته ۱۰ رقمی عدد در نظر گرفته میشود. مهم این است که فرمت کلی و رقم کنترلی صحیح باشد. هر سوال فنی دیگری داشتید، تماس بگیرید: 09190994063 | 09376846692
آیا ذخیره کد ملی و سایر اطلاعات شخصی کاربران ایرانی در سرورهای خارجی (مثلاً یک VPS در اروپا) با توجه به قوانین ایران مشکل قانونی دارد؟
بله، طبق الزامات مرکز داده ملی و قوانین داخلی ایران، کسبوکارهای ایرانی موظفند اطلاعات شخصی و هویتی کاربران ایرانی را در سرورهای داخل کشور نگهداری کنند. نقض این قانون میتواند عواقب جدی حقوقی به همراه داشته باشد. برای راهنمایی بیشتر، با ما تماس بگیرید: 09190994063 | 09376846692
بین کد ملی و شناسه ملی (برای شرکتها) چه تفاوتی وجود دارد؟ آیا الگوریتم اعتبارسنجی آنها مشابه است؟
کد ملی یک عدد ۱۰ رقمی برای اشخاص حقیقی (افراد) است، در حالی که شناسه ملی یک عدد ۱۱ رقمی است که برای اشخاص حقوقی (شرکتها و سازمانها) صادر میشود. الگوریتم اعتبارسنجی شناسه ملی با کد ملی متفاوت است و برای هر کدام باید الگوریتم مخصوص خود را به کار برد. برای راهنمایی در پیادهسازی، با ما تماس بگیرید: 09190994063 | 09376846692
در مورد eKYC، شرکتهای معتبر زیادی در ایران فعال هستند؟ شما کدام یک را توصیه میکنید و آیا خودتان این نوع سیستمها را پیادهسازی میکنید؟
بله، چندین شرکت معتبر ایرانی در زمینه eKYC فعال هستند که خدمات خوبی ارائه میدهند، مانند جیبیت و مصباحنت. انتخاب بهترین گزینه به نیازهای خاص کسبوکار شما بستگی دارد. تیم ما نیز در زمینه پیادهسازی سیستمهای احراز هویت و ادغام با سرویسهای eKYC تخصص دارد. برای مشاوره بیشتر میتوانید با ما تماس بگیرید: 09190994063 | 09376846692
تأکید بر رمزنگاری کد ملی خیلی مهم بود. آیا برای ذخیرهسازی اطلاعات احراز هویت (مانند زمان ارسال OTP و IP کاربر) هم باید رمزنگاری انجام شود یا صرفاً ذخیره امن کافی است؟
برای اطلاعات حساس مانند کد ملی، رمزنگاری (Encryption) ضروری است. برای سایر اطلاعات مرتبط با لاگها مانند IP و زمان، معمولاً ذخیرهسازی امن در پایگاه داده و محافظت از دسترسیهای غیرمجاز کافی است، اما رمزنگاری این اطلاعات نیز لایهای اضافی از امنیت را فراهم میکند. امنیت دادهها همواره اولویت است. برای راهنمایی بیشتر، با ما تماس بگیرید: 09190994063 | 09376846692
آیا صرف داشتن کد ملی، به من امکان میدهد که به اطلاعات کامل یک فرد (مانند نام پدر، تاریخ تولد یا آدرس) دسترسی پیدا کنم؟
خیر، کد ملی به تنهایی به شما امکان دسترسی به اطلاعات کامل یک فرد را نمیدهد. برای استعلام این نوع اطلاعات، شما نیاز به مجوز رسمی و دسترسی مستقیم به پایگاه داده سازمان ثبت احوال کشور دارید که این دسترسی فقط به نهادهای خاص و با رعایت پروتکلهای امنیتی داده میشود. هرگونه ادعای دسترسی بدون مجوز، غیرقانونی و مشکوک است. برای پیادهسازی امن، با ما تماس بگیرید: 09190994063 | 09376846692