PDA

View Full Version : کد کردن اطلاعات



jas1387
جمعه 29 آذر 1387, 22:46 عصر
سلام

من می خواستم خود اطلاعاتم را با برنامه نویسی کد کنم ولی یکی از دوستان به پیش نهاد داد تا از امکانات خود .net استفاده کنم که همچنین می گفت دارای الگریتم های خیلی قوی برای رمز گذاری اطلاعات است

که در این جا قرار دارد



using System.Security.Cryptography;


منمنون میشه کسی به من در این مورد کمک کنه

ennovation
شنبه 30 آذر 1387, 15:58 عصر
سلام
میتونی بگی دقیقا چی میخوای . منظورم اینه که یه سری اطلاعات در این مورد میخوای یا اینکه یک کد که مثلا یک رشته با این روش رو کد گذاری کنه .

jas1387
شنبه 30 آذر 1387, 22:09 عصر
سلام

یک کد که مثلا یک رشته با این روش رو کد گذاری کنه .
آره یک مثال کدی می خواهم

ennovation
یک شنبه 01 دی 1387, 02:36 صبح
سلام
نمونه مثال زیاده ولی این کد رو ببین که چطوری میتونی باهاش یک کلمه رو به صورت کد در بیاری اگه سوالی داشتی میتونی بپرسی . بعد هم بگو که میخوای این کد یک طرفه باشه یا دو طرفه . منظورم اینه که گاهی اوقات کافیه که فقط رشته داده شده رو بصورت کد درآورد و با اون کار کرد . مثلا پسورد کاربر را در نظر بگیر که تو پسورد رو میگری و بصورت کد در میاری و اونو با پسورد کد شده در جدول مقایسه میکنی . در این قسمت احتیاجی به برگشت کد ساخته شده به رشته اصلی نمیباشد ولی گاهی اوقات لازم داری که کد ساخته شده رو دوباره به حالت اول در بیاوری . اگه میشه بهم بگو که کجا میخوای از این کد گذاری استفاده کنی تا راه بهتر رو انتخاب کنیم . این کد پایین حالت یک طرفه است

using System;
using System.Security.Cryptography;
using System.Text;

class Example
{
// Hash an input string and return the hash as
// a 32 character hexadecimal string.
static string getMd5Hash(string input)
{
// Create a new instance of the MD5CryptoServiceProvider object.
MD5 md5Hasher = MD5.Create();

// Convert the input string to a byte array and compute the hash.
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(in put));

// Create a new Stringbuilder to collect the bytes
// and create a string.
StringBuilder sBuilder = new StringBuilder();

// Loop through each byte of the hashed data
// and format each one as a hexadecimal string.
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}

// Return the hexadecimal string.
return sBuilder.ToString();
}

// Verify a hash against a string.
static bool verifyMd5Hash(string input, string hash)
{
// Hash the input.
string hashOfInput = getMd5Hash(input);

// Create a StringComparer an comare the hashes.
StringComparer comparer = StringComparer.OrdinalIgnoreCase;

if (0 == comparer.Compare(hashOfInput, hash))
{
return true;
}
else
{
return false;
}
}


static void Main()
{
string source = "Hello World!";

string hash = getMd5Hash(source);

Console.WriteLine("The MD5 hash of " + source + " is: " + hash + ".");

Console.WriteLine("Verifying the hash...");

if (verifyMd5Hash(source, hash))
{
Console.WriteLine("The hashes are the same.");
}
else
{
Console.WriteLine("The hashes are not same.");
}

}
}
// This code example produces the following output:
//
// The MD5 hash of Hello World! is: ed076287532e86365e841e92bfc50d8c.
// Verifying the hash...
// The hashes are the same.

jas1387
یک شنبه 01 دی 1387, 08:28 صبح
سلام دوست عزیز

من دارم یک برنامه ای می نویسم که امنیتش خیلی مهم است آیا می تونم همه اطلاعات را کد کنم ( یعنی سرعت برنامه را کاهش نمی دهد ) ، بله اطلاعاتی که به صورت کد در می آید باید دوباره به حالت اولیه برگردد ، بازهم از کمک شما سپاسگزارم و چنانچه مشکلی داشتم مزاحم شما میشوم

Amir Oveisi
یک شنبه 01 دی 1387, 10:08 صبح
برای اینکه به حالت اولیه برگرده باید از الگوریتم هایی غیر از hashing (مثال بالا) استفاده کنید چون hashing یک الگوریتم یک طرفه است.
اگر با داده های کمی سر و کار دارین از RSA استفاده کنید ولی اگر با داده های متوسط یا بیشتر سر و کار دارید میتونین از AES (یا Rijendael) استفاده کنید.

نمونه کد تو اینترنت فراوون یافت میشه. کافیه یه Search بزنین.

موفق باشید
jooje

ennovation
یک شنبه 01 دی 1387, 15:24 عصر
سلام
اینکه چرا میخوای همه داده ها رو کد کنی به من مربوط نمیشه :چشمک: چون بهر حال این اطلاعات در یک دیتا بیس است و میتونی دسترسی به دیتابیس را محدود کنی و راحتتر به مقصد برسی و لی خوب حتما جواب قانع کننده ای داری که میخوای این کار رو بکنی بهرحال این نکته مسلمه که کد کردن و دوباره برگردوندن اون احتیاج به زمان داره حتی اگه چند میلی ثانیه طول بکشه با یک سیستم کند و حجم اطلاعات زیاد باعث هدر رفتن وقت کاربر میشه .
از این نکته بگذریم همانطور که دوست عزیزمون "Bermuda" اشاره کرد راههای زیادی وجود داره من یکی از این راهها رو که با روش Rijendael کار میکنه رو مینویسم میتونی همین طوری اینا رو کپی کرده و استفاده کنی. برای کد کردن اطلاعات میتونی این متد را استفاده کنی ولی قبل از اون احتیاج به یک کد داری که خودت به دلخواه خودت میتونی یک رشته رو بعنوان کلید انتخاب کنی مثلا من این کلید رو اینطوری نوشتم . تو هر رشته ای که دوست داری بنویس و بعدش هم که متد کد کردن رو نوشتم



static String Secret_key = "A KeyString for Encrypt from me !%&Ennovation&%!";


// ================================

static String EncryptString(String Value)
{
RijndaelManaged rd = new RijndaelManaged();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
Byte[] key = md5.ComputeHash(Encoding.UTF8.GetBytes(Secret_key) );
md5.Clear();
rd.Key = key;
rd.GenerateIV();
Byte[] iv = rd.IV;
MemoryStream ms = new MemoryStream();
ms.Write(iv, 0, iv.Length);
CryptoStream cs = new CryptoStream(ms, rd.CreateEncryptor(), CryptoStreamMode.Write);
Byte[] data = System.Text.Encoding.UTF8.GetBytes(Value);
cs.Write(data, 0, data.Length);
cs.FlushFinalBlock();
Byte[] encdata = ms.ToArray();
cs.Close();
rd.Clear();
return Convert.ToBase64String(encdata);
}


حالا با این متد میتونی کد رو به حالت اول برگردونی


staticString DecryptString(String Value)
{
RijndaelManaged rd = newRijndaelManaged();
int rijndaelIvLength = 16;
MD5CryptoServiceProvider md5 = newMD5CryptoServiceProvider();
Byte[] key = md5.ComputeHash(Encoding.UTF8.GetBytes(Secret_key) );
md5.Clear();
Byte[] encdata = Convert.FromBase64String(Value);
MemoryStream ms = newMemoryStream(encdata);
Byte[] iv = newbyte[16];
ms.Read(iv, 0, rijndaelIvLength);
rd.IV = iv;
rd.Key = key;
CryptoStream cs = newCryptoStream(ms, rd.CreateDecryptor(), CryptoStreamMode.Read);

Byte[] data = newbyte[ms.Length - rijndaelIvLength];
int i = cs.Read(data, 0, data.Length);
cs.Close();
rd.Clear();
return System.Text.Encoding.UTF8.GetString(data, 0, i);

}

امیدوارم که موفق باشی

jas1387
سه شنبه 03 دی 1387, 08:57 صبح
سلام

ضمن تشکر از شما دوستان عزیز

چند سوال دارم

1. اگر دیتابیس هست پس چه نیازی به کد کردن اطلاعات با برنامه نویسی است
2.من نمی تونم روی دیتابسم رمز بذارم دیتابیس من sql server 2005 است چگونه باید این کار را بکنم ( لطفا با راهنمایی کامل )

Amir Oveisi
سه شنبه 03 دی 1387, 09:10 صبح
خواهش میکنم

1- دیتابیس اطلاعاتش رمز نگاری نمیشن بصورت پیش فرض و اگر کسی نام کاربری و کلمه عبور مربوط به db شما رو داشته به راحتی میتونه بازش کنه (مثلا با SQL یا هر App. دیگه ای) و اطلاعاتش رو ببینه واسه همین اون فیلد هایی که امنیت بالایی میخواد (مثل فیلد هایی که شماره کارت های اعتباری مشتری هاتونو نگهداری میکنه) بهتره بصورت encrypt شده نگهداری بشه تا امنیت بیشتری داشته باشه app تون.

2- توی سایت جستجو کنید مطالب زیادی در این موارد هست حتما به دردتون میخوره

موفق باشید
jooje

kiarayan
جمعه 19 تیر 1388, 00:32 صبح
من هم یک سوال دارم در php با استفاده از md5 یک متن یک کد غیر قابل بازگشت می ده در c# نمونه این شکلی داره ؟

hojjatshariffam
سه شنبه 28 مهر 1388, 18:11 عصر
بله
تو سی شارپ هم الگوریتم های رمز نگاری از جمله md5 و RSA و ... وجود دارند
و MD5 رو هم که شما اشاره کردین یک رشته منحصر بفرد (اکثر در 99% موارد) میده که غیر قابل بازگشته
در واقع هش می باشد

ضمنا الگوریتم MD5 یا حتی بیشتر الگوریتم های دیگه ای که هستند به صورت استاندارد بوده و فرمول های خاص و پیچیده ریاضی دارند که در همه جا یکسان است و مختص به PHP یا سی شارب یا ... نمی باشند ، فقط در هر ورژن از زبانهای برنامه نویسی روش پیاده سازی و پیچیدگی الگوریتم پیاده سازی شده (در واقع سرعت و حافظه به کار گرفته شده) با هم متفاوت است ، و اصل الگوریتم یکسان می باشد