PDA

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



rezano
یک شنبه 12 اردیبهشت 1395, 19:14 عصر
با سلام
من یک سری متن توی دیتابیسم دارم که می خوام اونا رو کد گزاری کنم
از روش AES استفاده کردم که با استفاده از کتابخانه AESCrypt-Android (https://github.com/scottyab/AESCrypt-Android) خیلی راحت هم پیاده سازی شد.
ولی مشکل من اینه که می خوام شکل رشته انکریپت شده به صورتی باشه که بشه توش جستجو کرد
یعنی بتونم اول یه جمله رو انکریپت کنم و بعد یه کلمه رو، اونوقت اون کلمه رو توی جمله پیدا کنم.

نتیجه رمزگرازی با تکنیک AES به صورت زیر بود:

hello world : "2B22cS3UC5s35WBihLBo8w=="
hello : "ae5dtBC+LdKNJX+PAoEZSA=="


توی این روش من نمی تونم کلمه hello رو توی hello world پیدا کنم.

دنبال یه روشی میگردم که بشه جستجویی مثل مورد بالا رو انجام داد.

(چطور می تونم مثلا رشته رو به صورت 0 و 1 در بیارم؟ شاید اونطوری بشه یه کارایی کرد)

amirxbest
یک شنبه 12 اردیبهشت 1395, 20:41 عصر
برای اینکار شما میتونی خودت یه تابع برای رمزگذاری بنیسی که حروف رو تبدیل کی با الگوریتمهای خودت مثلا a رو b ,,, b رو c تبدیل کنی و بعد با همون تابع همه کارا رو میتونی انجام بدی این ساده ترین و راحت ترینش هست

SZsXsZS
دوشنبه 13 اردیبهشت 1395, 06:16 صبح
خب رمزنگاری های قوی اینطور هستن که ازشون هیچ اطلاعاتی نمیشه فهمید. غیر از این باشه که دیگه رمزنگاری قوی نمیشه!
تاجاییکه حضور ذهن دارم هیچ راهی نیست جز اینکه ابتدا اطلاعات رو رمزگشایی کنید و بعد جستجو کنید. مگر اینکه یک روش ترکیبی ای چیزی ابداع کنید مثلا برای دیتاهای رمز شده یک جدول ایندکسی چیزی هم درست کنید که قبل از رمز کردن یکسری کلمات کلیدی خاص رو درشون ثبت کنید که توی کدوم رکوردها هست و غیره. البته طبیعتا اینطوری کدنویسی و پیچیدگی برنامه بالا میره (و ضمنا امنیت هم پایین میاد و دیگه تضمینی که رمزنگاری قوی درموردش میداد وجود نداره).
اما از سوی دیگر اولا AES الگوریتم پرسرعتیه، دوما در MySQL که یادمه خودش الگوریتم AES رو داشت (یعنی میتونید توسط خود MySQL و در درون کوئری ها از این الگوریتم استفاده کنید)، حالا باید دید آیا دیتابیسی که شما استفاده میکنید هم چنین امکاناتی داره یا نه. طبیعتا اینطوری هم سرعت بالا میره و هم کد شما کمتر و ساده تر میشه. ولی خب اولا باید ساپورت بشه و دوما ردیف کردنش احتمالا یخورده تخصص میخواد.
از اون طرف باید دید اصولا شما واسه چی دیتا رو رمز میکنید و چه درجه ای از امنیت مد نظرتونه؟
روشهایی مثل Caching و اینها هم طبیعتا در بعضی موارد میشه استفاده کرد که سرعت بالا بره و نیاز به رمزگشایی های چندباره نباشه (یعنی مثلا دیتای رمزگشایی شده رو اگر میشه و حجمش خیلی زیاد نیست تا زمان باز بودن برنامه در حافظه یا فایلی نگه دارید). البته طبیعتا کش شدن هم اکثرا امنیت رو پایین میاره و مخدوش میکنه (فرض کنید برنامه یا گوشی کرش کنه و دیتای رمزنشده همونطور جایی باقی بمونه).

خلاصه علم امنیت و رمزنگاری دنیای گسترده و پیچیده ای هست و ظرافت های زیادی داره و طراح امنیت باید پارامترهای متعددی رو در حالات مختلف درنظر بگیره. اما احتمالا اطلاعات و برنامهء شما از نظر امنیتی اونقدری مهم نیست که بخواید اینقدر مته به خشخاش بذارید! در این صورت میشه از روشهای من درآوردی مثل اونایی که کاربر دیگر اشاره کردن هم استفاده کرد و یا شاید اصلا از خیر رمزنگاری گذشت!!

الگوریتم های رمزنگاری مدرن مثل AES برای امنیت در سطح بالا و کارهای حرفه ای هستن. مثل AES-256 (فکر نمیکنم اکثر افراد و کاربردها به بیشتر از 128 نیاز داشته باشن) و بنظرم یخورده مسخره است اصولا که چنین کتابخانه ای برای اپلیکیشن های موبایل باشه (شک دارم خود نویسندهء این کتابخانه هم سواد و صلاحیت کامل در چنین حدی رو داشته بوده باشه که یک کتابخانهء رمزنگاری رو واقعا طبق اصول و استانداردهای لازم بسازه!) و مردم ازش در برنامه هاشون استفاده کنن و فکر کنن واقعا به این حد از امنیت رسیدن، بخاطر اینکه امنیت در عمل به خیلی پارامترها و نکات و ظرافت ها و مسائل جانبی دیگری هم وابسته است که افراد غیرمتخصص ازشون اطلاع و بینش درستی ندارن و حتی متخصص ها هم خیلی وقتا رعایت نمیکنن (از روی گشادی/صرف نکردن یا از زیر دستشون در میره بهرصورت).