نوع داده ها در دیتابیس

strad

New Member
سلام......دوتا سوال در رابطه با سی شارپ دارم ممنون میشم بهم جواب بدید:
1 - بهترین نوع داده برای قیمت ، تاریخ و شماره تلفن در دیتابیسsql چیه؟
2 - نحوه hash کردن پسورد در دیتابیس چجوریه؟
 

the_king

مدیرکل انجمن
سلام......دوتا سوال در رابطه با سی شارپ دارم ممنون میشم بهم جواب بدید:
1 - بهترین نوع داده برای قیمت ، تاریخ و شماره تلفن در دیتابیسsql چیه؟
برای قیمت طبعا decimal ، در محاسبات مالی نیاز به اعداد اعشاری هست، اما باید محاسبات کاملا دقیق و بدون خطا باشند.
انواع داده ای مثل double برای ثبت مقدار اعشاری از ممیز شناور استفاده می کنند که محاسباتش تخمینی است
و الزاما دقیق نیست. decimal در عین حال که یک نوع داده اعشاری یه، محاسبات اعشاری رو با ممیز ثابت انجام میده،
یعنی خطای ممیز شناوری که در انواع داده اعشاری عادی مثل double و float رخ می دهند رو نداره.

2 - نحوه hash کردن پسورد در دیتابیس چجوریه؟
در حالت عادی و بدون Hash اگر رمز عبور را در بانک اطلاعاتی ثبت کنید و دسترسی به بانک اطلاعاتی وجود داشته باشد می توانیم رمز عبور را مشاهده کنیم.
با کمک Hash کاری می کنیم که بجای رمز عبور کدی را ثبت کنیم که فقط می تواند مشخص کند که فلان رمز صحیح است یا خیر، یعنی اگر رمزی را به اون بدهیم
اعلام کند این همان رمز اصلی است یا خبر. وگرنه کدی که از Hash بدست آمده نمی تواند رمز اصلی را اعلام کند.

یک شیوه Hash رو به دلخواه انتخاب می کنید، رشته رمز عبور رو با اون Hash تبدیل به یک کد می کنید و در بانک اطلاعاتی بجای Password اصلی اون کد رو ثبت می کنید.
این کد یکطرفه است، یعنی از روی کد نمی توانید رمز اصلی را بدست بیاورید، اما اگر کاربر موقع ورود به سیستم رمز رو تایپ کرد، می توانید رمز مورد نظر رو Hash کنید
و بررسی کنید که آیا کد بدست آمده با کدی که در بانک اطلاعاتی ثبت کرده بودید مطابقت داره یا نه. اگر مطابقت داشت به احتمال خیلی زیاد رمز عبور صحیح است
(احتمال بسیار کمی وجود دارد که دو رمز کاملا متفاوت Hash شان یکسان باشد) اما اگر دو کد فرق داشتند قطعا رمز عبور اشتباه است.
 

strad

New Member
برای قیمت طبعا decimal ، در محاسبات مالی نیاز به اعداد اعشاری هست، اما باید محاسبات کاملا دقیق و بدون خطا باشند.
برای تاریخ و شماره موبایل چطور؟




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

یک شیوه Hash رو به دلخواه انتخاب می کنید، رشته رمز عبور رو با اون Hash تبدیل به یک کد می کنید و در بانک اطلاعاتی بجای Password اصلی اون کد رو ثبت می کنید.
این کد یکطرفه است، یعنی از روی کد نمی توانید رمز اصلی را بدست بیاورید، اما اگر کاربر موقع ورود به سیستم رمز رو تایپ کرد، می توانید رمز مورد نظر رو Hash کنید
و بررسی کنید که آیا کد بدست آمده با کدی که در بانک اطلاعاتی ثبت کرده بودید مطابقت داره یا نه. اگر مطابقت داشت به احتمال خیلی زیاد رمز عبور صحیح است
(احتمال بسیار کمی وجود دارد که دو رمز کاملا متفاوت Hash شان یکسان باشد) اما اگر دو کد فرق داشتند قطعا رمز عبور اشتباه است
روش های hash کردن در سی شارپ چجوریه؟


ممنون
 

the_king

مدیرکل انجمن
برای تاریخ و شماره موبایل چطور؟

بستگی به کاربرد و میزان پردازشی داره که روی اون تاریخ و شماره موبایل انجام میشه. فرضا اگه تاریخ دقیق یک عملیاتی (مثل زمان صدور فاکتور) ثبت میشه،
بهتره که از نوع داده DateTime استفاده بشه که تاریخ و ساعت رو بصورت استاندارد یکجا ذخیره می کنه و امکانات مقایسه تاریخ های مختلف و مرتب سازی اش ساده است.
طبعا اگه قراره شماره موبایل ها بتوانند با رقم 0 یا کاراکتر + شروع شوند باید از نوع داده رشته ای string استفاده کنید.

روش های hash کردن در سی شارپ چجوریه؟

برای استفاده از روتین های مربوطه System.Security.Cryptography رو در ابتدای کد تان using کنید :
کد:
using System.Security.Cryptography;


اول رمز عبور مورد نظر رو در متغیری مثل password دارید :
کد:
            string password = "123456";

قبل از Hash کردن اون رمز عبور رو به آرایه ای از بایت ها تبدیل خواهید کرد چون Hash ها ذاتا هم ورودی و هم خروجی شان داده باینری است، نه رشته string
کد:
            byte[] bytes = Encoding.Unicode.GetBytes(password);

سپس با یکی از شیوه های Hash ای که Net. ارائه می کنه فرضا SHA1 اون آرایه رو Hash می کنید.
و برای آنکه خروجی اش که آرایه از بایت ها است رو بتوان بصورت string ذخیره کرد، به Base64 تبدیل اش می کنیم :
کد:
            string code = Convert.ToBase64String(HashAlgorithm.Create("SHA1").ComputeHash(bytes));

بجای "SHA1" می توانید از سایر Hash های مرسوم مثل "MD5" یا "SHA256" یا "SHA512" استفاده کنید.
SHA1 یک Hash ئه 160 بیتی است، MD5 یک Hash ئه 128 بیتی است، SHA256 یک Hash ئه 256 بیتی و SHA512 یک Hash ئه 512 بیتی است.
هر چه تعداد بیت های Hash بیشتر باشند مقدار code خروجی هم طولانی تر خواهد بود، برای رمز عبور یک Hash ئه 128 بیتی هم کفایت می کند.
همین روال را موقع چک کردن رمز عبور در هنگام ورود کاربر انجام خواهید داد و code ثبت شده در بانک اطلاعاتی را با code رمزی که کاربر تایپ کرده مقایسه خواهید کرد.

Base64 می تواند هر آرایه ای از بایت ها را بصورت یک رشته متنی که قابل نمایش هم هست ثبت کند. یکی از کاربرد های مهم Base64
در ذخیره کردن فایل های پیوستی در ایمیل است چون ایمیل اساس بصورت متن ارسال می شود و مستقیما امکان درج کردن داده باینری در متن وجود ندارد.
 

جدیدترین ارسال ها

بالا