برای طرح سوال و دسترسی به آموزش ها  کانال ما در تلگرام بپویندید  

رمزنگاری و hash در جاوا اسکریپت

به نام دانای بر حق

 

مقدمه

یکی از مسائلی که کاربرد های امنیتی زیادی داره استفاده از سیستم های های رمزنگاری و hash و حتی encoding هستش، خب حالا یکی از مسائلی که میشه بهش اشاره کرد این هستش که جاوا اسکریپت یکی از زبان های خانواده اسکریپت هاس همونطور که از اسمش پیداس و اما یه تفاوت خیلی مهم بین javascript  و سایر زبان های اسکریپت نویسی دیگر مثل php و python هستش اونم این هستش که js یه زبان سمت کاربر هستش یعنی قسمت های کد اون در سمت رایانه های سرور اجرا نمیشود و بر روی سیستم بازدید کننده های وب اجرا میشود و اما یه نکته اساسی هستش که جاوااسکریپت هم در تشخیص داده های دودوی یا باینری ضعیف عمل میکنه واسه همین  پیاده سازی hash ها و encryption ها سخت هستش.

 

معرفی کتابخونه crypto js

یک کتابخونه قوی در زمینه hash و رمزنگاری و حتی کدگذاری در انباری کد های گوگل یافت میشود که توسط Jeff.Mott.OR نوشته شده است که جای تحسین دارد برای استفاده از اون و میشه ازالگورتیم هایی که کتابخونه  CryptoJS نام دارد الگوریتم های :  MD5, SHA-1, SHA-2, SHA-3, HMAC, PBKDF2, AES, TripleDES, Rabbit, RC4 نام برد.

CryptoJS حال حاضر نسخه ۳.۱.۲ هستش و در سایت گوگل برای ما تحریم می باشد دیدن صفحه اش و صفحه ی اصلیش این صفحه است و برای گذر از تحریم ما کتابخونه اش رو که به حجم ۱۵۵ کیلوبایت هست رو درانتهای این نوشته پیوست می کنیم.

نحوه استفاده

اول باید عرض کنم بهترین مرجع برای دیدن نحوه استفاده صفحه ای هستش که در بند فوق ذکر شد، اما ما در این از ۴ مثال استفاده میکنم برای استفاده:

مثال اول یک hash معمول MD5:

منظور از معمول بدون دستکاری هستش برای این کار باید کتابخونه اون رو فراخونی کننین و کد رو به شکل زیر اجرا کنید:

<script type="text/javascript" src="CryptoJS v3.1.2/rollups/md5.js"></script>
<script type="text/javascript" >
                 var hash = CryptoJS.MD5("123456");

                 var aaa = hash.toString(CryptoJS.enc.Hex);
                
// namayesh 
                 console.log(aaa);
                 document.writeln(aaa);
            </script>

 یک hash تعمیم یافته و یا شخصی سازی شده:

ما در مثال های دیگر از نمایش امتناع می کنیم و از SHA256 استفاده می کنیم:

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha256.js"></script>
<script>
    var sha256 = CryptoJS.algo.SHA256.create();

    sha256.update("Message Part 1");
    sha256.update("Message Part 2");
    sha256.update("Message Part 3");

    var hash = sha256.finalize();
</script>

 یک مثال از encoding با base64 :

در خطوط زوج خط ابتدا  اندکد کردن و خط بعدی دیکود کردن است:

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/core-min.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-utf16-min.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script>
<script>
    var words  = CryptoJS.enc.Base64.parse('SGVsbG8sIFdvcmxkIQ==');
    var base64 = CryptoJS.enc.Base64.stringify(words);

    var words  = CryptoJS.enc.Latin1.parse('Hello, World!');
    var latin1 = CryptoJS.enc.Latin1.stringify(words);

    var words = CryptoJS.enc.Hex.parse('48656c6c6f2c20576f726c6421');
    var hex   = CryptoJS.enc.Hex.stringify(words);

    var words = CryptoJS.enc.Utf16.parse('Hello, World!');
    var utf16 = CryptoJS.enc.Utf16.stringify(words);

    var words = CryptoJS.enc.Utf16LE.parse('Hello, World!');
    var utf16 = CryptoJS.enc.Utf16LE.stringify(words);
</script>

آخرین مثال از AES و یه رمزنگاری و رمزگشایی می باشد:

خط ابتدایی اطاعات رو رمزنگاری می کند و خط بعدی رمزگشایی:

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script>
    var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");

    var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
</script>

 

خلاصه:

خلاصه کلام این که ما با این کتابخونه آشنا شدیم و میتونیم نیاز هامون رو باهاش برآورده کنیم و از خودمون رو دز محدودیت کد نویسی جاوا اسکریپت نبینیم، و اما یکی از مزیت های این موضوع این هستش که شما میتونید الگورتیم های خودتون رو cross platform اجرا کنین بدون این دغدغه سیستم عامل و موضوع بعدی استفاده از این روش برای کد شده اطلاعات در سمت سرور و دریافت آن در سمت سرور و از حالت کد شده خارج کردن هستش که موجب میشود تا رهگیری و بررسی بی مورد مثل فیـــ—–ــلـــــ—-ترینگ  bypass شوند که وب پــــروکـــــســـی ها هم از این روش استفاده می کنند.

امیدوارم مفید واقع شده باشه.

 


انتشار

در

توسط

برچسب‌ها:

نظرات

3 پاسخ به “رمزنگاری و hash در جاوا اسکریپت”
  1. ماهان نیم‌رخ
    ماهان

    بعد از خوندن مطالب این صفحه یی سوال برام پیش اومد:

    میخواستم بپرسم آیا از این روش میشه برای خلاص شدن از این محدودیتهایی که در پایان اشاره شد ، استفاده کرد ؟
    به فرض اسکریپتی نوشت که درخواستها و پاسخها رو کد شده فرستاد و گرفت !
    شاید مزیتش این باشه که دور زدن فیلهارو سبکتر و سریعتر از پروکسی انجام بده ! و نیاز به سرور دیگه نباشه !
    فکر میکنید اینکار شدنی هست یا از لحاظ فنی غیر ممکن هست چنین کاری ؟

    ممنون از شما

    1. ‌A1Gard نیم‌رخ
      ‌A1Gard

      این کار شدنی هستش اما سریع تر از پروکــسی های معمول نیست!
      روش های زیادی وجود داره برای اعمال این عمل من خودم چند ماه پیش یه addon فایرفاکس نوشتم و بسیاری از این محدودیت ها رو باهاش دور میزدم.
      اما سرعت قابل توجهی نداشت و بدون سرور دیگه امکان پذیر نیست
      ولی برای کد کردن و ارسال اطلاعات مخدوش شدن اصل اطلاعات خیلی کاربردی و مفید است. یعنی مقابله با sniff

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *