رمزنگاری و تولید چکیده (hash) پیام 128 بیتی با کلاس MHR1

سلام

این کلاس را مدتی پیش در AS3، برای تولید چکیده پیام طراحی کردم.

کلاس MHR1 یک روتین رمزنگاری 128 بیتی (خروجی 32 کاراکتری در مبنای 16) است که به صورت open source در این فروم منتشر میشود.
اگر با توابع hash آشنا نیستید، این مطلب را مطالعه کنید: مقاله md5

هدف توابع hash، رمزنگاری و تولید چکیده با طول یکسان از هر نوع رشته ورودی است، که کاربرد آنها موارد زیر هستند:

- ذخیره کلمات عبور به صورت چکیده در دیتابیس
- تولید امضای دیجیتال
- تشخیص صحت یا تغییر محتوای فایلها
- ایجاد امضا در ارسال پارامترهای url برای بررسی صحت آنها
و غیره


تفاوت این الگوریتم با روشهای مرسومی مانند md4 , md5، در سرعت بیشتر و سادگی آن است. البته کاملا روشن است که به دلیل دست‌ساز بودن الگوریتم آن، به اندازه الگوریتمهای استاندارد، ایمن نیست، اما لااقل امنیت آن برای طراحان فلش کافی است.

مثال چگونگی کار به همره خود کلاس در فایل ضمیمه قرار دارند.

attachment.php


مثال:

کد:
 import classes.mshams.MHR1;
trace(new MHR1("Your String1 Here..."));
trace(new MHR1("Your String2 Here..."));
 
var myHash: MHR1 = new MHR1();
trace(myHash.getHash("Your String1 Here..."));
    trace(myHash.getHash("Your String2 Here..."));
 

پیوست ها

  • test.PNG
    test.PNG
    5 کیلوبایت · بازدیدها: 171
  • MHR1_class.zip
    1.6 کیلوبایت · بازدیدها: 63
  • MHR1_test.zip
    473.2 کیلوبایت · بازدیدها: 122
آخرین ویرایش:

++Hadi++

Active Member
خیلی ممنون محمد عزیز ...
مبحث مهم بود ، از نظر تایپیکی هم مهم شد ...
 
سلام محمد جان مقالت رو تو سایت خوندم عالی بود و گفته بودی این فرایند یکطرفه هست
اقا یه زحمت دارم نمیدنم ممکنه معکوس این کدینک رو بنویسی
در کل میخواستم اگه ممکنه 2 تا کلاس بینویسی واسه ایجاد کد و یکی دیگه واسه چک کردن کد (برا ایحاد رمز)
 
سلام محمد جان مقالت رو تو سایت خوندم عالی بود و گفته بودی این فرایند یکطرفه هست
اقا یه زحمت دارم نمیدنم ممکنه معکوس این کدینک رو بنویسی
در کل میخواستم اگه ممکنه 2 تا کلاس بینویسی واسه ایجاد کد و یکی دیگه واسه چک کردن کد (برا ایحاد رمز)


از آنجا که کدهای HASH، کاملا یکطرفه هستند، پس هیچ روش معکوسی برای آنها وجود ندارد. تنها راه Crack کردن آنها به روش bruteforce است.


روش استفاده از hash در ایجاد password به این صورت است که شما پس از دریافت رمز، Hash آن را محاسبه کرده و در دیتابیس ذخیره میکنید. خود پسورد را هم دور می اندازید چون با وجود hash ، به آن نیازی نیست.

برای مقایسه رمز دریافتی از کاربر با پسورد موجود در دیتابیس هم، پس از دریافت رمز، hash آن را محاسبه کرده و با hash موجود در دیتابیس مقایسه میکنید.
اگر hash ها با هم برابر بودند، یعنی پسوردهای اصلی هم با هم برابر بودند.
 
از آنجا که کدهای hash، کاملا یکطرفه هستند، پس هیچ روش معکوسی برای آنها وجود ندارد. تنها راه crack کردن آنها به روش bruteforce است.


روش استفاده از hash در ایجاد password به این صورت است که شما پس از دریافت رمز، hash آن را محاسبه کرده و در دیتابیس ذخیره میکنید. خود پسورد را هم دور می اندازید چون با وجود hash ، به آن نیازی نیست.

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

BehrouzPc

پــــادشــاه فــلــــش
بسیار سپاسگزارم برای کلاس Hash ، محمد شمس عزیز :rose:

این مورد ها را برای ورودی input string تست نمایید

PHP:
2222222222222222222222222222222222222222222222222222222222222222222222
یا
PHP:
11111111111111111111111111111111111111111111111111111111111111111
یا
PHP:
3333333333333333333333333333333333333333333333333333333333333
یا
PHP:
44444444444444444444444444444444444444444444444444444444
یا
PHP:
555555555555555555555555555555555555555555555555555555
یا
PHP:
be222222222222222222222222222222222222222222222222222222222222222222222222

و...

Generated Hash
PHP:
itititititititititititititititit



موفق و پیروز باشید
 
آخرین ویرایش:
سلام

جالبه، چون با رشته‌های طولانی تستش نکرده بودم، نمیدونستم یه جای کار Overflow میشه.
ممنون که تست کردید.

سریعا این ایراد را برطرف میکنم
 

arjmand200

Member
جالب بود ، ولی اگه قبل از نوشتن کلاس یه بار as3corelib رو چک میکردی (crypto/MD5) خیلی کمکت میکرد
 
سلام

مشکل حل شد. محدودیت کلاس Number را درست حساب نکرده بودم.

جالب بود ، ولی اگه قبل از نوشتن کلاس یه بار as3corelib رو چک میکردی (crypto/MD5) خیلی کمکت میکرد


بله قبلا با as3corelib کار کرده‌ام. همچنین کلاسهای متعدد دیگری برای الگوریتهای DES, AES و غیره هم موجود است.
اما هدف من از ارائه این کلاس، طراحی ساده‌ترین روش برای ایجاد Hash بود. در واقع این یک کلاس آموزشی برای فهم نحوه عملکرد و ساختمان الگوریتمهای رمزنگاری یکطرفه بود و نمی‌خواستم الگوریتمهای موجود را در as3 پیاده سازی کنم.

در هر صورت کلای opensource است و خوشحال میشوم اگر بقیه دوستان هم آن را تکمیل و update کنند. (البته قبلش خوب تستش کنن که مثل الان مشکل پیش نیاد)
 

BehrouzPc

پــــادشــاه فــلــــش
ممنون محمد شمس عزیز ، بنده تست کردم و مساله ای مشاهده نکردم :rose:
موفق و پیروز باشید
 

++Hadi++

Active Member
sسلام محمد جان
کاری که شما انجام دادید خیلی ارزنده هست .
یه پیشنهاد :
اگه کاربری که می خواد مثلا یه ایکسملو به رمز تبدیل کنه ، بیاد و از کلاس شما استفاده کنه می تونه ... ولی شاید افراد دیگه ای که از جریان کار و اینکه مثلا من دارم از کلاس شما استفاده می کنم ، خبر دار بشن ، به راحتی بتونن سو استفاده کنن . من تو این فکر هستم که یه قابلیتی رو به کلاس شما اضافه کنم که رمز رو به نسبت یه رشته دیگه که اون فقط تو ذهن مثلا من باشه ، بیرون بده و خوبی این کار اینه که مثلا برای یه رشته خاص مثل "flashcs5" می تونین به نسبت رشته کلیدی که به این کلاس پاس می دین ، رمزی متفاوت رو دریافت کنین ... نظر شما چی هست ؟
 
سلام

ممنون

کاربری که می خواد مثلا یه ایکسملو به رمز تبدیل کنه ، بیاد و از کلاس شما استفاده کنه

از این کلاس فقط برای ایجاد hash استفاده میشود و یک روش کدگذاری داده (Generic encryption) نیست. در نتیجه اگر کسی از دیتای خود، با این کلاس یک چکیده (Message Digest ) تولید کرده و در جایی ذخیره نمود، دیگر نمیتواند دیتای اولیه خود را از روی آن بازیابی کند.

در نتیجه داده ای که از روی آن Hash ایجاد شده، خودش نوعی کلید غیر قابل بازیابی است.

ولی شاید افراد دیگه ای که از جریان کار و اینکه مثلا من دارم از کلاس شما استفاده می کنم ، خبر دار بشن ، به راحتی بتونن سو استفاده کنن

همونطور که گفتم نمیشه از روی Hash، داده اولیه را حساب کرد.

من تو این فکر هستم که یه قابلیتی رو به کلاس شما اضافه کنم که رمز رو به نسبت یه رشته دیگه که اون فقط تو ذهن مثلا من باشه...

این کار میشه تقریبا نوعی Salted Hash.
اما نیازی نیست قابلیت جدیدی به کلاس استفاده کنید. برای اینکه از بیشترین امنیت ممکن بهره‌مند بشوید، میتونید رشته مورد نظرتون را چند بار متوالی Hash کنید.

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

++Hadi++

Active Member
از شما دوست عزیزم متشکرم .
من این قابلیت رو (افزودن رشته ثانویه ) اضافه کردم و خوبیش فقط به اینه که می تونیم برا n کار مختلف که قراره مثلا از یه ساختار ایکسمل یا از کلمات شبیه به هم استفاده کنند ، با تغییر کلمه دوم ، n جور کلمه رمز hash مختلف داشته باشیم .
البته در مورد ایکسمل بیان شما کاملا متین . ولی من برا اینکه حجم پردازشی کار خیلی بالا نره اومدم و مثلا هر 200 کاراکتر ایکسمل یکی رو انتخاب و در یه رشته concat کردم و در نهایت اینو با رشته پسورد دوم وارد کلاس شما کردم .
در کل خیلی ممنونم ...
در مورد کلاس ویرایشی هم مطمئن باشید که محفوظ برا شما می مونه و جایی آپ نمی شه ...
موفق باشید و خیلی ممنون ...
 
سلام

اتفاقا خیلی خوشحال می‌شوم، اگر قابلیت جدید یا ایده‌ای برای تکمیل یا افزایش امکانات این کلاس اجرا کرده و نتیجه را در همین جا اضافه کنید.

اگر دقت کرده باشید در سورس کلاس، بخشی به نام LICENSE BLOCK تعبیه کردم که به این معناست که هر گونه استفاده و تغییر در کلاس آزاد است. معمولا در عرف پروژه‌های open source (البته این کلاس خیلی کوچکتر از این حرفهاست که پروژه محسوب شود) به این صورت است که با توجه به نوع مجوز (که در اینجا MPL است) هر توسعه گر دیگری که امکانات جدیدی به آن اضافه میکند، اطلاعاتی مانند (Date, Author, Version, Update , ...) را در انتهای بخش UPDATES (بعد از END LICENSE BLOCK) اضافه میکند.

به این ترتیب کسی که یک فایل open source را دریافت میکند، با مطالعه آن بخش متوجه میشود که نویسندگان یا توسعه دهنگان آن پروژه چه کسانی بوده و هر کدام در چه تاریخی چه قابلیتی به آن اضافه کرده‌اند.
 

++Hadi++

Active Member
محمد جان بینهایت از لطفت سپاسگزارم ...
والا خیلی حرفه ای پیش نبردم باز به روی چشم به زودی یه سمپل واستون می زارم .
البته کاری که من کردم خیلی سخت نیست چون هر تغییری که در جفت کاراکتر های 16 رقمی بدیم ، با متد substr فقط دو رقم اولش در رمز اصلی قرار می گیره ... من خیلی کار ساده ای کردم .
در نهایت به لطف خدا و با یازی شما ، دیگه امکان سو استفاده از ایکسمل پروژه ام نیست چرا که از تگ های داخلی ایکسمل رمز خاصی بوجود می یاد که این رمز رو یه برنامه exe (با قرار دادن ایکسمل کنارش) به نمایش می زاره و کافیه اون رمز رو در فیلد attribute با عنوان مثلا key قرار بدیم تا خروجی اصلی بتونه اونو تایید کنه وگرنه ایکسمل تایید نمی شه ...
موفق باشید ...
 

BehrouzPc

پــــادشــاه فــلــــش
محمد جان بینهایت از لطفت سپاسگزارم ...
والا خیلی حرفه ای پیش نبردم باز به روی چشم به زودی یه سمپل واستون می زارم .
البته کاری که من کردم خیلی سخت نیست چون هر تغییری که در جفت کاراکتر های 16 رقمی بدیم ، با متد substr فقط دو رقم اولش در رمز اصلی قرار می گیره ... من خیلی کار ساده ای کردم .
در نهایت به لطف خدا و با یازی شما ، دیگه امکان سو استفاده از ایکسمل پروژه ام نیست چرا که از تگ های داخلی ایکسمل رمز خاصی بوجود می یاد که این رمز رو یه برنامه exe (با قرار دادن ایکسمل کنارش) به نمایش می زاره و کافیه اون رمز رو در فیلد attribute با عنوان مثلا key قرار بدیم تا خروجی اصلی بتونه اونو تایید کنه وگرنه ایکسمل تایید نمی شه ...
موفق باشید ...
هادی عزیز با md5 هم فکر کنم بشه همین کار رو انجام داد فایل نهایی xml ما به کد md5 دارد که درون برنامه ابتدا چک می شود و بعد استفاده

در مورد xml محمد شمس عزیز توی یکی از پروژه هاش از روش تبدیل به فایل باینری استفاده کرده بود که به نظرم برای این کار اون روش هم خوب هست

///

بنده هم با محمد در مورد این نوع ارتقاع کد ها موافق هستم.
 

++Hadi++

Active Member
کلاس mhr آپدیت شد - ورژن 1.2

سلام
توجه : ورژن 1.3 کلاس محمد عزیز آپدیت شد .
من تو این فکر بودم که چطور می شه راهی پیدا کرد که بتونیم از یه رشته خاص ، چند رمز رو بیرون بکشیم . خوب به این فکر افتادم که رشته دیگه ای رو به عنوان کد واژه به این کلاس خوبی که محمد عزیز زحمتشو کشیدند ، اضافه کنیم تا رشته ورودی اصلی با این رشته کد واژه ترکیب شه تا بتونیم از یه رشته ، رمز های مختلفی رو داشته باشیم . پس این کلاس رو ویرایش کردم تا به این هدف برسم و اینو برای عموم آپ کردم . زحمت اصلی این کلاس رو دوست عزیزم محمد شمس کشیده اند و ما هم به قدری ولو نا چیز ، اونو بهبود بخشیدیم ، مثالی رو آپ کردم که در اون ، ایکسملی خونده می شه و بعد کاراکتر های خاصی از تگ های خاص اون خونده می شه و در فایل exe نمایش رمز ، این کاراکتر ها در یه رشته به همراه کد واژه به این کلاس پاس داده می شه و بعد شما شاهد این هستین که رمز نهایی از فایل exe قفل ساز ، به نمایش در می یاد . سپس با همین الگریتم ، این ایکسمل در فایل اصلی خونده می شه و فایل اصلی چک می کنه که آیا پسوورد صادر شده از کلاس محمد عزیز ، با کد فیلد key که در روت اصلی ایکسمل هست ، برابر هست یا نه ، اگه بله ، پس سورس اجرا می شه و در صورت عدم سازگاری و تساوی ، سورس اعلام میکنه که ایکسمل سازگار نیست و اجرا نمی شه . این می تونه روشی نسبتا خوب برای محافظت از استفاده دوباره از مولتی مدیایی بشه که قراره برای کسی بنویسین . اگر هم کارفرمای شما اجازه اینو داشته باشه که ایکسمل رو دستکاری کنه ، فایل exe نمایش رمز جدید رو بهش می دین تا کنار ایکسمل قرار بده و بتونه ایکسمل رو عوض کنه . از خوبی های کد واژه که من به این کلاس اضافه کردم اینه که شما ، می تونین برای یه پروژه که مثلا برای 100 نفر قرار هست بفروشین ، 100 کد واژه مختلف رو تعریف میکنین و به نسبت ساختار جدید ایکسمل ها ، 100 جور پسورد مختلف برای 100 مشتری صادر شه ، چرا که این 100 مشتری ایکسمل هاشون در یک ساختار هست و نمی خوان که مشتری شماره 1 به محصولی که مشتری شماره 2 برای خودش درست کرده ، دسترسی ویرایشی داشته باشه . فرض کنین که مشتری شماره 1 ، یه بانک نرم افزاری می خواد ، خوب این مشتری نمی خواد که 99 مشتری دیگه ، بانک نرم افزاری ایشون رو دستکاری کنه ، فرض کنین که کمی سورس ها رو برای هر مشتری عوض کردین ، مثلا ساختار ایکسمل ها رو یه کم بهم ریختین ، در کل می خواهین خروجی پسوورد شما به نسبت کد واژه ای باشه که شما به سورس اصلی می دین ، درکل این روش یه روش خوبی هست تا کنترل همه چیز بیشتر به دست شما باشه ...
من کد های این پروژه رو در اینجا قرار ندادم ولی با دانلود این فایل های rar ، می تونین به همه اونها دست پیدا کنین و باید با فلش cs5 باز کنین .

توجه کنین که اگر این 100 خروجی رو به 100 مشتری دقیقا با یه ساختار ایکسمل بفروشین ، اونا می تونن از ایکسمل بقیه مشتری ها استفاده کنن و فقط پسوورد رو از فایل exe نمایش پسوورد خودشون در بیارن ولی باید ترتیبی رو ارائه بدین تا ساختار کمی پیچیده تر باشه . در ضمن این کار از این بابت به نفع شماست چرا که هر کدوم از مشتری ها به خاطر عدم دستکاری و سو استفاده محصول اصلی خودشون ، نمی یان تا خروجی exe شما همراه با فایل نمایش پسوورد رو به افراد دیگه هم بفروشن ...
در واقع تقریبا می شه گفت برای محصولاتتون ، کد لایسنس بوجود می یارین ...
درمثال گفته شده :
1- اگه بعد از ویرایش فردی که اجازه ویرایش رو نداره ، حتی یه حرف از ایکسمل نهایی کم یا زیاد بشه ، پسوورد به هم می ریزه .
2- اگه به فرض محال تعداد حروف ایکسمل ویرایش شده توسط فردی که اجازه ویرایش نداره ، با ایکسمل اصلی یکی باشه ، باید ببینیم که آیا حروفی که ویرایش شده جزو یکی از رشته هایی هست که در حلقه رشته ورودی به این کلاس وارد می شه یا نه ، پس هر چی تعداد بیشتری از کاراکتر های یه ایکسمل رو وارد این کلاس کنیم و دایره ورودی ها رو تنگ تر کنیم تا تعداد بیشتری وارد بشن ، تعداد عملیات کامپیوتری رو بالاتر بردیم ولی شانس دستکاری وموفقیت افراد اهل سو استفاده رو پایین تر بردیم .
3-(*جدید*) این دقیقا ساختاری هست که محمد عزیز زحمتشو کشیده و من هیچ دستی تو کد های ایشون نبردم فقط یه تابع دیگه ای به اسم getKeyHash اضافه شده که فقط یه کد کلید یا KeyWord رو اضافه می گیره و به نسبت اون ، hash و نتیجه اونو عوض می کنه و ساختارش هم بر این اساسه که اون keyWord وارد رشته اصلی می شه و به اول اون اضافه می شه و الباقیش می شه همون سیستم معمول hash MD5 که آقا محمد ترتیبشو داده . این موارد به درخواست محمد جان انجام شده و خود بنده هم دیگه نخواستم تو این سیستم دستی ببرم.
موفق باشید ...
 

پیوست ها

  • com.rar
    1.5 کیلوبایت · بازدیدها: 65
  • Hello MHR Sample.rar
    638.6 کیلوبایت · بازدیدها: 164
  • MHR V.1.3 XML Lock Sample.rar
    577 کیلوبایت · بازدیدها: 172

BehrouzPc

پــــادشــاه فــلــــش
توی XML ها با حجم کمی بالا توی رمز ایجاد شده Key Generator نمونه ای شبیه به OverFlow دیده میشه البته به دلیل این که ادامه و ابتدا این مشکل رو ندارد شاید نشه بهش گفت باگ ولی ، اگه itititititit هم به رشته ای نا منظم تبدیل بشه بهتر می باشد
مثلا دو نمونه
3fa2225227a2ititititititd78ea69e
3c5720662ddaititititititdb539d97

در ضمن از هادی عزیز برای این کار تشکر ویژه ای می کنم ، موفق و پیروز باشید :rose:
 

++Hadi++

Active Member
توی XML ها با حجم کمی بالا توی رمز ایجاد شده Key Generator نمونه ای شبیه به OverFlow دیده میشه البته به دلیل این که ادامه و ابتدا این مشکل رو ندارد شاید نشه بهش گفت باگ ولی ، اگه itititititit هم به رشته ای نا منظم تبدیل بشه بهتر می باشد
مثلا دو نمونه
3fa2225227a2ititititititd78ea69e
3c5720662ddaititititititdb539d97

:rose:

کلاس آپدیت شد ...در پست 17 ...
فکر کنم یه کم مشکلاتش حل شده . چون کاری که قبلا می کردم ، احتمال زیادی رو واسه OverFlow داشته ولی الان کمتر شده ...
موفق باشید ...
 

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

بالا