PDA

View Full Version : سوال: روش استفاده از الگوریتم رمزگذاری



jalil_m
پنج شنبه 24 فروردین 1391, 13:50 عصر
سلام دوستان.
من یه برنامه با سی شارپ و دیتابیس اس کیو ال نوشتم و الان برنامه آماده شده.ضمنا از Entity FrameWork استفاده کردم
حالا به این نتیجه رسیدم که اطلاعات بعضی از فیلد ها باید در داخل دیتابیس رمزنگاری بشه.
الگوریتمشو هم آماده کردم.اما چه طوری کدهای برنامه رو تغییر بدم که با کمترین زمان و کار بشه این کارو کرد؟
میخوام اطلاعات به صورت رمزی ذخیزه بشه و بعد که select میشه برگردونده بشه
میشه فایل Model1.designer.cs رو تغییر داد؟
لطفا اگر کسی میتونه کمک کنه
ممنون

j_naroogha@yahoo.com
پنج شنبه 24 فروردین 1391, 13:56 عصر
شاید جواب کاملی نباشه. اما دو تا کلاس Encrpt و Decrpt درست کن . بعد از این دو کلاس استفاده کنید.(باید کد تون رو که نوشتین تغییر بدین.).اگه از شی گرایی استفاده کرده باشین که کارتون زیاد سخت نیست.

jalil_m
پنج شنبه 24 فروردین 1391, 14:18 عصر
ممنون.عرض کردم کلاسهاشو درست کردم.برای کار با رکوردها هم از Entity framework استفاده کردم.حالا کجای کد هارو دستکاری کنم که موقع ثبت کد و موقع select دیکد بشه اطلاعات؟ یه جوری باشه مجبور نشم کل کدهارو عوض کنم

jalil_m
پنج شنبه 24 فروردین 1391, 16:09 عصر
یعنی کسی بلد نیست؟
فکر میکردم سوال خیلی ساده هست

jalil_m
پنج شنبه 24 فروردین 1391, 21:17 عصر
اگر کسی میتونه کمک کنه.واقعا کارم گیره اینه

j_naroogha@yahoo.com
پنج شنبه 24 فروردین 1391, 22:25 عصر
ببین داداش من. اگه من درست متوجه شده باشم
شما اطلاعاتی رو که در بانک تون ثبت می کنید حتما از کاربر گرفتین(از طریق تکست باکس و...) .
خوب بعد از اینکه این ورودی ها رو گرفتین کد گذاری می کنید ودر بانک مینویسید. نقطه مقابل هم همین طور هست اول از بانک می خونید دیکد می کنید وسپس نمایش می دید.

p.yazdkhasti
پنج شنبه 24 فروردین 1391, 22:46 عصر
سلام
بهتره برای این کار از روش های کدگذاری Symmetric استفاده کنید. برای این کار الگوریتم های مختلفی وجود دارد که من الگوریتم RijndaelManaged را پیشنهاد می کنم. روش کار به صورت زیر است:

var original = "Here is some data to encrypt!";
byte[] key, iv;
string encrypted, decrypted;

using (var myRijndael = new RijndaelManaged())
{
myRijndael.GenerateIV();
myRijndael.GenerateKey();
key = myRijndael.IV;
iv = myRijndael.IV;
var encryptor = myRijndael.CreateEncryptor();
var decryptor = myRijndael.CreateDecryptor();

using (var msEncrypt = new MemoryStream())
{
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (var swEncrypt = new StreamWriter(csEncrypt))
{


swEncrypt.Write(original);
}
encrypted = Encoding.ASCII.GetString(msEncrypt.ToArray());

}
}

using (var msDecrypt = new MemoryStream(Encoding.ASCII.GetBytes(encrypted)))
{
using (var csDecrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read))
{
using (var swDecrypt = new StreamReader(csdecrypt))
{

decrypted = swdecrypt.ReadToEnd();
}
}
}
}



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

EF کلاس های مربوط به Model را به صورت Partial می سازد. به منظور استفاده از کد بالا در EF لازم است یک کلاس دیگر با نام موجودیت خود در Namespace مربوط به کلاس ایجاد شده توسط EF ایجاد نمایید.سپس در صورتی که فیلدی را که می خواهید از اطلاعات آن به صورت Decrypted در پروژه استفاده نمایید PropertyNameEncrypted بنامیم یک Property دیگر در کلاسی که ایجاد کردید با نام PropertyName ایجاد کنید و در Setter و Getter آن PropertyNameEncrypted را با استفاده از کد بالا Encrypt و Decrypt نمایید. برای مثال در صورتی که موجودیت را EntityName بنامیم کد زیر باید استفاده شود:

partial class EntityName
{

public string PropertyName {

get { return Decrypt(this.PropertyNameEncrypted); }
set { this.PropertyNameEncrypted = Encrypt(value); } }
}

jalil_m
جمعه 25 فروردین 1391, 02:53 صبح
بسیار ممنونم از راهنماییتون
کد دوم خیلی خوبه اما فرض کنید من توی جدول دیتابیس یه فیلدی دارم به اسم Question که تا الان مثل بقیه بوده ولی حالا میخوام کد گذاریش کنم.اگه یه پراپرتی تعریف کنم چه جوری تو دستورات برنامه ازش استفاده بشه به جای این فیلد اصلی؟ یعنی نمیشه فیلد اصلی رو دستکاری کرد؟ اینجوری باید کل کد برنامه رو عوض کنم.اگه بشه طوری عمل کنم که به سورس برنامه دست نخوره خیلی عالی میشه

p.yazdkhasti
جمعه 25 فروردین 1391, 10:38 صبح
سلام
روش ساده برای انجام این کار این است که در Model Designer بر روی Property مربوط به Entity مورد نظر کلیک کنید و از طریق پنجره Properties مربوط به Visual Studio مقدار Property Name را به مقدار دیگری برای مثال QuestionEncrypted تغییر دهید. دقت کنید که با این تغییر نیازی به تغییر نام فیلد Database نمی باشد و تنها نام Property تغییر می کند. بعد از این تغییر با استفاده از روش ذکر شده در بالا (یعنی ایجاد یک کلاس در Namespace موجودیت مورد نظر به صورت Partial با نام یکسان) یک Property با نام Question ایجاد نمایید که در Setter و Getter خود از QuestionEncrypted استفاده می کند و مقدار آن را Decrypt و یا Encrypt می کند. با این روش کد های موجود شما تغییری نخواهند کرد زیرا Property مورد نظر شما وجود دارد ولی در getter و setter خود از property قدیمی با نام جدید استفاده کرده است.

C#.net
جمعه 25 فروردین 1391, 14:03 عصر
تکنیک مورد استفاده آقای p.yazdkhasti تکنیک ساده و موثری هست و به خوبی نیاز شما رو پوشش می ده، اما برای پیاده سازی روشی بدون نیاز به پراپرتی اضافی، همونطور که عرض کردم :


برای پیاده سازی روشی بهتر به این لینک (http://msdn.microsoft.com/en-us/library/bb738612.aspx)مراجعه بفرمایید

راه حلی خواهد بود مبتنی بر استفاده از POCO که چون توسط خود شما توسعه داده می شه، دسترسی نا محدود در طراحی اونها دارید.

از مدیران محترم هم درخواست دارم پست های مشترک اینجا و تاپیک دیگر (http://barnamenevis.org/showthread.php?333621-%D8%B1%D9%85%D8%B2-%D9%86%DA%AF%D8%A7%D8%B1%DB%8C-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D9%85%D9%88%D8%AC%D9%88%D8%AF-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D8%AA%D9%88%D8%B3%D8%B7-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE) (از پست 8 به بعد) ادغام کنند

p.yazdkhasti
جمعه 25 فروردین 1391, 14:49 عصر
سلام
با روش آقای #C موافقم. استفاده از POCO نیز روش بسیار خوبی است ولی با توجه به این که شما بخش زیادی از نرم افزار را آماده کرده اید و به احتمال زیاد با این روش آشنایی ندارید من روش دیگر را به شما پیشنهاد کردم.

jalil_m
شنبه 26 فروردین 1391, 00:27 صبح
از هر دو شما عزیزان ممنونم بابت راهنمایی های مفیدتون
چون هم تازه کارم،هم بخش زیادی از کار انجام شده و هم زمان زیادی ندارم فکر کنم رو پراپرتی ها کار کنم زودتر به نتیجه برسم