PDA

View Full Version : گفتگو: رمز نگاری اطلاعات موجود در پایگاه داده توسط سی شارپ



generic
شنبه 05 فروردین 1391, 21:49 عصر
من میخام اطلاعات مربوط به تیبل کاربران را در دیتابیس را رمز نگاری کنم در این مورد هم اطلاعاتی ندارم از دوستان کسی هست ما را راهنمایی کتد یا لینکی معرفی کند.
متشکر

C#.net
شنبه 05 فروردین 1391, 22:23 عصر
بسته به مورد استراتژی های مختلفی هست، دو تاش رو مرور می کنیم:

A- روش قابل بازیابی
1- اطلاعات رو از کاربر می گیریم
2- به صورت رمز شده (بازگشت پذیر) در دیتابیس ذخیره می کنیم
3- برای بازیابی اطلاعات رو (که رمز شده هستند) از دیتابیس دریافت می کنیم
4- اطلاعات رو رمز گشایی می کنیم

برای پیاده سازی این روش به اینجا مراجعه کنید (http://www.codeproject.com/Articles/5719/Simple-encrypting-and-decrypting-data-in-C)

B- روش یک طرفه
در این روش ها اطلاعات به صورتی رمزگذاری می شوند که قابل رمزگشایی نباشد!
مثلا برای ذخیره کلمه عبور راهکار مناسبی هست که حتی برنامه نویس هم به پسورد کاربران دسترسی نداره!
ممکنه بپرسید به چه دردی می خوره؟ خوب با این میکانیزم کارایی داره:
1- کلمه عبور به صورت رمز شده در دیتابیس ذخیره می شه
2- وقتی کاربری می خواد وارد بشه، رمز وارد شده رمزگذاری شده و با اطلاعات دیتابیس مقایسه می شود.

برای پیاده سازی می تونید از میکانیزم های Hashing بهره بگیرید

generic
یک شنبه 06 فروردین 1391, 00:36 صبح
ممنون از مطالبی که زحمتشو کشیدین.
من لینکیرو که دادین نگاه کردم ولی در مورد پارامترهایی که به متدها پاس میشن متوجهشون نشدم. اگه شما از این الگوریتم استفاده کردین در مورد پارامترهای متدها توضیح بدین .
چون لازم دارم که عملا استفادش کنم.

C#.net
یک شنبه 06 فروردین 1391, 01:09 صبح
شما از همین دو تا signature استفاده کنید:

public static string Decrypt(string cipherText, string Password)
public static string Encrypt(string clearText, string Password)

برای به دست اوردن نتیجه درست باید پسوردتون در انکریپت(رمزنگاری) و دکریپت(رمزگشایی) یکسان باشه(می تونید تابع ها رو جوری بازنویسی کنید که این پارامتر رو نداشته باشه و مستقیما از وب کانفیگ یا یه ثابت بخونه) پسورد در حقیقت کلید رمزنگاری هست.

cipherText محتوای رمزنگاری شده و
clearText دیتای عادی هست

generic
دوشنبه 07 فروردین 1391, 22:01 عصر
سلام
من موفق به استفاده از این کد نشدم .
برنامه من یک Application میباشد که دیتابیس هم دارد . میخوام تیبل کاربران را رمز نگاری کنم .
یعنی وقتی یک کاربر جدید ثبت میشود رمز آن کاربر رمزی بوده و قابل تشخیص نباشه.
این sample شما دو تا متد داره که این عملیات را انجام میده و طوری طراحی شدن که با stream ها کار میکنند. و یک سری پارامترهای دیگر. چون چیزی از دو متد سر در نمیارم نمیتونم اونها را طبق خواسته خودم (یعنی کار با تیبل) نمیتونم استفاده کنم.
در هر صورت ممنونم که وقت میذارید.
هم اکنون هم محتاج کمک هستم.:لبخندساده:

jalil_m
پنج شنبه 24 فروردین 1391, 20:11 عصر
سلام C#.net
من یه برنامه با سی شارپ نوشتم و از روش Entity استفاده کردم.می تونید به من کمک کنید حالا که برنامه تموم شده چه تغییری تو کد بدم که اطلاعات مثل روش بالا رمز نگاری بشه؟
الگوریتم کد و دیکد رو نوشتم.فقط میخوام یه جای فایل مدل رو دستکاری کنم که این کارو انجام بده.ممنون میشم جواب بدید

C#.net
پنج شنبه 24 فروردین 1391, 21:44 عصر
سلام C#‎.net
من یه برنامه با سی شارپ نوشتم و از روش Entity استفاده کردم.می تونید به من کمک کنید حالا که برنامه تموم شده چه تغییری تو کد بدم که اطلاعات مثل روش بالا رمز نگاری بشه؟
الگوریتم کد و دیکد رو نوشتم.فقط میخوام یه جای فایل مدل رو دستکاری کنم که این کارو انجام بده.ممنون میشم جواب بدید

بهترین جا برای انجام این کار ورودی هست که به داده ها دسترسی داریم، می تونیم اونها رو بخونیم و در اونها بنویسیم: Properties
با ایجاد تغییر در پراپرتی مربوط به فیلد مورد نظرتون، می تونید getter رو طوری بازنویسی کنید که به اطلاعات رو رمزگشایی کنه.

تغییر دیگه ای که باید انجام بشه موقع ذخیره کردن اطلاعات هست که باید فیلد مورد نظرتون رو رمزگذاری کنید تا در دیتابیس ذخیره بشه.

اگر دستی yourModel.Designer.cs رو ویرایش کنید به پاسخ خواهید رسید ولی هنگامی که مدل رو از طریق دیتابیس به روزرسانی کنید، کد هاتون از دست خواهد رفت!
برای پیاده سازی روشی بهتر به این لینک (http://msdn.microsoft.com/en-us/library/bb738612.aspx)مراجعه بفرمایید

jalil_m
جمعه 25 فروردین 1391, 04:11 صبح
من در بانکم جدولی یه اسم Question دارم که در EF با نام Questions بهش دسترسی داریم.اینو میدونم که با دستکاری پراپرتی میشه این کارو کرد.اما فقط تغییر یک پراپرتی مشکل رو حل میکنه؟ یعنی متدها نیاز نیست دستکاری بشن؟
اگر فقط همین کافیه به من بفرمایید که کدوم پراپرتی؟ اگر زحمتی نیست یه دیتابیس درست کنید و با ویزارد مدل رو دست کنید و پراپرتی رو مشخص کنید که تو فایل دیزاینر کجا رو باید تغییر بدم.ممنون میشم اگر اینجوری پروژه بهم بدید.چون تازه کارم
اگر مقدور بود
ممنونم ازتون

jalil_m
جمعه 25 فروردین 1391, 04:15 صبح
اینم دیتابیس اگر ممکنه کمک کنید مشکلم حل بشه
ممنونم

C#.net
جمعه 25 فروردین 1391, 11:22 صبح
من در بانکم جدولی یه اسم Question دارم که در EF با نام Questions بهش دسترسی داریم.اینو میدونم که با دستکاری پراپرتی میشه این کارو کرد.اما فقط تغییر یک پراپرتی مشکل رو حل میکنه؟ یعنی متدها نیاز نیست دستکاری بشن؟
اگر فقط همین کافیه به من بفرمایید که کدوم پراپرتی؟ اگر زحمتی نیست یه دیتابیس درست کنید و با ویزارد مدل رو دست کنید و پراپرتی رو مشخص کنید که تو فایل دیزاینر کجا رو باید تغییر بدم.ممنون میشم اگر اینجوری پروژه بهم بدید.چون تازه کارم
اگر مقدور بود
ممنونم ازتون

اول بایست بگم که متن جواب بالا رو کمی تغییر دادم...
برای رمز گشایی کردن به فرض این که فیلد Question رو رمزنگاری میکنید، در فایل دیزاینر کلاس Question : EntityObject دارای پراپرتی Question خواهد بود که باید قسمت get اون رو به این صورت تغییر بدید:

public global::System.String Question
{
get
{
return Decrypt(_Question);
}
.
.
.

برای رمز نگاری هم تنها راهی که به ذهنم می رسه اینه که هنگام پر کردن آبجکت این کار رو انجام بدید

aghayex
جمعه 25 فروردین 1391, 11:35 صبح
من اینکارو به اینصورت باسه خودم حل کردم که در قسمت entities ها در مدل هر جدول یه entities داره و هر ستون یه پروپرتی اومدم برا هر ستون یه پروپرتی ساده نوشتم و در قسمت گت پروپرتی جدید مقدار پروپرتی قدیمی رو گرفتم و تغیرش دادم برا ست هم در بخش ست پروپرتی جدید مقدار رو گرفتم و بعد از کد کردنش پاسش دادم به پرو پرتی قدیمش
حالا تو برنامه من دیگه اگه بخوام جدول رو به یه دیتابیس مقید کنم باید از پرو پرتی های جدید که تعریف کردم استفاده کنم .
وسلام

p.yazdkhasti
جمعه 25 فروردین 1391, 12:18 عصر
سلام
این سوال تکراری می باشد و پاسخ آن در تاپیک زیر داده شده است:
http://barnamenevis.org/showthread.php?336244-%D8%B1%D9%88%D8%B4-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-%D8%B1%D9%85%D8%B2%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C

aghayex
جمعه 25 فروردین 1391, 15:34 عصر
شما وقتی یه ان تی تی به پروژه اضافه می کنید دو فایل به پروژه اضافه می شه :
1 - فایلی با پسوند edmx با کلیک بر روی این فایل جداول شما به صورت نمادهایی ظاهر می شود البته به همراه روابط بین آنها
2 - فایلی با پسنود designer.cs این فایل رو شما دابل کلیک کنید که شامل دو بخش هست
بخش اول : که یک کلاس هست که اشیایی دارد و این اشیا همان جداول شما هستند
بخش دوم : در این بخش هر جدول به صورت یک کلاس پیاده سازی شده مثلا جدول nh

[EdmEntityTypeAttribute(NamespaceName="SKHAModel", Name="nh")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class nh : EntityObject
{
پروپرتی ها
}

حالا بسته به تعداد ستون های جدول شما پروپرتی دارید .
فرضا ما در این جدول یک پرو پرتی داریم:

[EdmEntityTypeAttribute(NamespaceName="SKHAModel", Name="nh")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class nh : EntityObject
{
#region Factory Method

/// <summary>
/// Create a new nh object.
/// </summary>
/// <param name="in">Initial value of the in property.</param>
/// <param name="n">Initial value of the n property.</param>
public static nh Createnh(global::System.Byte[] @in)
{
nh nh = new nh();
nh.@in = @in;
return nh;
}

#endregion
#region Primitive Properties

/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
[DataMemberAttribute()]
private global::System.Byte[] @in
{
get
{
return StructuralObject.GetValidValue(_in);
}
set
{
if (!StructuralObject.BinaryEquals(_in, value))
{
OninChanging(value);
ReportPropertyChanging("in");
_in = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("in");
OninChanged();
}
}
}
private global::System.Byte[] _in;
partial void OninChanging(global::System.Byte[] value);
partial void OninChanged();

public string @in2
{
get
{
if (@in != null)
{
return تابع دی کد کننده(@in);
}
else
{
return "";
}
}
set
{
@in = تابع کد کننده(value);
}
}
{

roohial
دوشنبه 13 آبان 1392, 12:52 عصر
انجام این کار تو C# اشتباهه
این کار رو تو sql انجام بده
میتونی از لینک زیر استفاده کنی
http://programmersheaven.blogfa.com/post/7