PDA

View Full Version : سوال: درخواست الگوریتم امن برای تولید رشته رندوم



lifeless
چهارشنبه 24 تیر 1394, 12:45 عصر
سلام دوستان
بنده به یه الگوریتم #C نیاز دارم که بصورت Realtime یه رشته مثلا ده رقمی متشکل از حروف بزرگ و عدد تولید کنه و احتمال تکراری بودن رشته های تولید شده صفز باشه!
کسی میتونه لطف کنه کمکم کنه؟ :)
ممنونم

xsbehx
چهارشنبه 24 تیر 1394, 13:11 عصر
http://barnamenevis.org/showthread.php?499472-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D8%B4%D9%85%D8%A7%D8%B1%D9%87-%D9%81%D8%A7%DA%A9%D8%AA%D9%88%D8%B1&p=2232309&viewfull=1#post2232309

TeacherMath
چهارشنبه 24 تیر 1394, 13:18 عصر
اگه می خوای انگلیسی باشه
Guid.NewGuid()
می تونی فقط عدد تولید کنی:

public static String GetTimestamp(DateTime value) {
return value.ToString("yyyyMMddHHmmssffff");
}


String timeStamp = GetTimestamp(DateTime.Now);


ورژن دوم:
public static String GetTimestamp2() {


var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var time = DateTime.UtcNow.Subtract(new TimeSpan(epoch.Ticks));
return (time.Ticks / 10000).ToString();


}

می تونی اونو طوری تغییر بدی که حروف رو هم شامل باشه.

Javad_raouf
چهارشنبه 24 تیر 1394, 17:34 عصر
Random با غیر تکراری تناقض داره
بگید برا چی می خواین تا بشه بهتر بهتون کمک کرد

lifeless
پنج شنبه 25 تیر 1394, 07:48 صبح
دوستان بنده یه برنامه برای مدیریت بازاریاب هاییه شرکت نوشتم. بازاریاب ها باید افرادی که بازاریابی میکنن رو از طریف کد هایی که از قبل بهشون میدیم ثبت سیستم کنن. به این شکل که به هر مشتری یه کد اختصاص میدن و به همراه مشخصات مشری کدشو هم ثبت میکنن. از اونجایی که بازاریاب ها به ازای هر یک از این کد ها پول میدن، پس باید امنیتشون بالا باشه که کسی نتونه سوع استفاده کنه. جواد جان کد (رشته) کاملاً باید رندوم باشه و در عین حال هیچ کدی به صورت تکراری نباید ساخته و تحویل بازاریاب داده بشه. یه چیزایی در مورد الگوریتم های کریپتوگرافی تولید داده های رندوم خوندم، اما خواستم نظر شمارو بدونم. ممنونم بابت راهنمایی همه اساتید :)

golbafan
پنج شنبه 25 تیر 1394, 09:52 صبح
سلام ایجاد کد رندم سخت نیست اما اگر قراره که تکراری هم نباشه پس باید کدهای قبلی رو در دیتابیس ذخیره کنی و بعد از ایجاد رندم جدید چک کنی در دیتابیس موجود هست یا نه
اگر تکراری نبود اون رو ثبت کنی و اگر تکراری بود باید مجدد رندم ایجاد کنی

یکی از بهترین روش ها برای کاری که میخوای بکنی اینه که دو تا رندم بین 0 و 1 تولید کنی و اونها رو بهم بچسبونی و سپس ازشون MD5 بگیری:


str1=random->tostring
str2=random->tostring
str3=str1+str2
str4=md5(str3)

====
1- 0.65489231
2- 0.56489488
3- 0.56489488 0.65489231
4- CB38BFY3FG7H64BC73T64B762T4762T72G76BT4762TBC7


حالا اگر میخوای یک طول ثابت مثلا 10 کاراکتر باشه میتونی 10 تا از کاراکترهای نهایی رو برداری
البته توصیه میکنم کلشو در نظر بگیری

lifeless
پنج شنبه 25 تیر 1394, 11:29 صبح
سلام ایجاد کد رندم سخت نیست اما اگر قراره که تکراری هم نباشه پس باید کدهای قبلی رو در دیتابیس ذخیره کنی و بعد از ایجاد رندم جدید چک کنی در دیتابیس موجود هست یا نه
اگر تکراری نبود اون رو ثبت کنی و اگر تکراری بود باید مجدد رندم ایجاد کنی

یکی از بهترین روش ها برای کاری که میخوای بکنی اینه که دو تا رندم بین 0 و 1 تولید کنی و اونها رو بهم بچسبونی و سپس ازشون MD5 بگیری:


str1=random->tostring
str2=random->tostring
str3=str1+str2
str4=md5(str3)

====
1- 0.65489231
2- 0.56489488
3- 0.56489488 0.65489231
4- CB38BFY3FG7H64BC73T64B762T4762T72G76BT4762TBC7


حالا اگر میخوای یک طول ثابت مثلا 10 کاراکتر باشه میتونی 10 تا از کاراکترهای نهایی رو برداری
البته توصیه میکنم کلشو در نظر بگیری

نظر شما متین اما موضوع اینه که تعداد رکورد های دیتابیس در آینده خیلی زیاد خواهد شد و دیگه نمیشه چک رو انجام داد چونکه بار سنگینی میاد روی دیتابیس. پس باید متدی به کار برده شه که حتی المقدور از تولید داده تکراری هم جلوگیری شه. ضمناً امنیت الگوریتمشم خیلی مهمه، که کسی نتونه اعداد رو به هیچ طریقی حدس بزنه.

golbafan
پنج شنبه 25 تیر 1394, 23:33 عصر
نظر شما متین اما موضوع اینه که تعداد رکورد های دیتابیس در آینده خیلی زیاد خواهد شد و دیگه نمیشه چک رو انجام داد چونکه بار سنگینی میاد روی دیتابیس. پس باید متدی به کار برده شه که حتی المقدور از تولید داده تکراری هم جلوگیری شه. ضمناً امنیت الگوریتمشم خیلی مهمه، که کسی نتونه اعداد رو به هیچ طریقی حدس بزنه.

اگر میخوای تکراری نباشه چاره ای نیست باید چک کنی!
با این حال روشی رو که بهت پیشنهاد دادم تعداد حالت هایی که ممکنه تولید کنه میشه:
10 به توان 18 حالت
فکر میکنم برای کار شما مناسب باشه

Mahmoud.Afrad
جمعه 26 تیر 1394, 00:49 صبح
در مورد اینکه میخواهید قابل حدس نباشه: با توجه به اینکه کد تولید شده رو در دیتابیس ذخیره میکنی، برای اینکه صحت یک کد که به شما ارائه شده رو مورد سنجش قرار بدید هیچ راهی جز جستجو در دیتابیس ندارید. در مورد استفاده بیش از یک بار از کد توسط بازاریاب هم میتونید ستون مورد نظر رو در دیتابیس unique نظر بگیرید و تا حد امکان کد تولید شده طولانی باشه.

public class UniqueRandomStringGenerator
{
private static readonly char[] AvailableCharacters =
{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
};

public static string GenerateIdentifier(int length)
{
StringBuilder stringBuilder = new StringBuilder();
byte[] randomData = new byte[length];

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
rng.GetNonZeroBytes(randomData);
}

for (int idx = 0; idx < randomData.Length; idx++)
{
int pos = randomData[idx] % AvailableCharacters.Length;
stringBuilder.Append(AvailableCharacters[pos]);
}

return stringBuilder.ToString();
}
}

golbafan
شنبه 27 تیر 1394, 11:54 صبح
سلام
یک روش جدید برای اینکه نیازی نباشه دیتابیس رو چک کنی و همچنین مطمئن باشی که هیچ وقت کد تکراری بهت نمیده:
پس به شکل زیر عمل کن:
از عدد 1 شروع میکنیم:

i=1
loop
(
i++
var1 = i + random // 1.4345345
result = md5(var1+timestamp) // CUWHNY3G67G3R7GC3NR7GNN3RN6R
)

lifeless
یک شنبه 04 مرداد 1394, 09:28 صبح
خیلی خیلی ممنونم از راهنمایی دوستان. دوستان یه سری سایت ها هستن که کدهای خروجی متد MD5 رو دیکریپت میکنن. نظرتون چیه؟ آیا امنیت MD5 زیر سوال نمیره؟

ژیار رحیمی
یک شنبه 04 مرداد 1394, 11:42 صبح
به برداشت من تحلیل شما از این بخش از سیستم بازاریابی اشتباه هست.نمیخوای که پول الکترونیک چاپ کنی که اینقدر امنیت رو لحاظ میکنی. شما به ازای هر بازاریاب که در سیستم ثبت میشه یه کد منحصربه فرد تولید کن به عنوان کلید هر بازاریاب و .برای ثیت نام مشتریان کلید ترکیبی کد بازاریاب و کد رندوم اسفاده کن یعنی دو بخشی.به هیچ عنوان کلیدهات تکراری نخواهد بود.کدهایی که تولید میکنی و به بازاریاب میدهی بخش اول کد کلید بازایاب بخش دوم کلید رندوم تولید شده است.برای ثبت نام مشتریان از این کد برای کلید رجیستر شدن استفاده کن.لازم به ذکر است آنچه به عنوان کارمزد به بازاریاب میدن در قبال فاکتور فروش هست نه میزان کدهای که بازار یاب به عنوان مشتری معرفی کرده.ممکنه یه بازاریاب 1000 مشتری رو جذب کنه و در سیستم شرکت رجیستر کنه ولی میزان خرید این 1000 مشتری 100 فاکتور باشه به همان میزان 100 فاکتور کارمزد میگیرد

golbafan
دوشنبه 26 مرداد 1394, 14:01 عصر
خیلی خیلی ممنونم از راهنمایی دوستان. دوستان یه سری سایت ها هستن که کدهای خروجی متد MD5 رو دیکریپت میکنن. نظرتون چیه؟ آیا امنیت MD5 زیر سوال نمیره؟

شما یک کد رو دو / سه بار با MD5 هش کنید ببینید کدوم سایت میتونه برش گردونه؟ محاله... امکان نداره...
در هش کردن همیشه مقداری از دیتا از دست میره پس قابل برگشت نیست