هم اکنون عضو شوید

ورود

فراموشی گذرواژه

گذروازه خود را فراموش کردید ؟

ورود

عضو شوید

با عضویت در سایت از امکانات فوق العاده بهرمنده خواهید شد.

دوره آموزش برنامه نویسی اندروید
آموزش رمز گذاری بروی دیتابیس sqlite در اندروید

آموزش رمز گذاری بروی دیتابیس sqlite در اندروید

سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش رمز گذاری بروی دیتابیس sqlite در اندروید می پردازیم حتما این آموزش را دنبال کنید به تازگی هر برنامه که در کافه بازار منتشر می شود بعد از چند ساعت یک اپ مشابه آن نیز انتشار پیدا می کند پس هر برنامه ای که دیتابیس داشته باشد به راحتی decompile می شود حالا سوال اینجاست چه طور decompile می شود و راه جلوگیری از چیست در ادامه با ما همراه باشید.

اگر برنامه شما کد (encrypt) نشده باشد اگر Extension آن منظور apk یا پسوند آخر آن است آن را تغییر دهید و بکنید .zip مشاهده می کنید که به بخشی از اپ دسترسی پیدا کردید یعنی اگر نام فایل برابر با test.apk بود به test.zip تغییرش دهید و آن را باز کنید ما کاری به این نداریم فقط یک آموزش بود شما این کار رو نکنید. (البته استفاده از آن دردسر دارد )

چه گونه جلوگیری کنیم ؟

قبل از اینکه راه جلوگیری آن را بگیم یک عیب این کار دارد . این کار باعث می شود حجم دیتابیس چند کیلوبایتی ما به چند مگ تبدیل شود ولی راهی برای کم حجم کردن آن هست شما باید خود دیتابیس را نیز فشرده کنید منظور فشرده سازی معمولی نیست و این نوع فشرده سازی کار هر کسی نیست باید حداقل چند سال در این زمینه کار کرده باشید روشی که ما استفاده می کنیم به نام sqlcipher است.

برای شروع ابتدا کتاب خانه زیر را اضافه کنید.

پس وارد فایل Build.gradle از نوع module شده و در بخش dependencies خط زیر را اضافه کنید.

دیگر در اینجا کد های تکراری را توضیح نخواهیم داد و فقط بخش مربوط به encryption رو توضیح می دهیم.

یک فایل جاوا به نام FeedReaderContract.java ایجاد کرده و کد های زیر را در آن قرار دهید.

یک کلاس دیگر جاوا به نام FeedReaderDbHelper.java ایجاد کنید و کد زیر را در آن قرار دهید.

در بالا SQLiteDatabase و SQLiteOpenHelper از net.sqlcipher.database نه از کلاس android.database.sqlite یه چیزی که در کد بالا استفاده نشده است void زیر است

از این void برای بررسی api گوشی استفاده می شود چون sqlcipher از api 2.1 به بالا کار می کند البته فکر نمی کنم دیگر گوشی در این api وجود داشته باشد ولی در کل گفتم که بدونید.

 

حالا برویم به سراغ ادامه کار در MainActivity.java خود کد زیر را قرار دهید.

در بالا ما یک insert ساده انجام داده ایم ! بخش مهم کار که در هیچ سایتی نوشته نشده است خط زیر است.

شاید اگر آموزش دیتابیس را خوانده باشید کد زیر برای شما آشنا باشد.

این کار باعث میشه تا هم حجم دیتابیس بالا رود و هم با خطای زیر مواجه می شوید

با بررسی که انجام دادم خود sqlcipher داری یک فشرده ساز فوق العاده است که در بالا بری شما کد آن را قرار دادم .

 

این آموزش هم به پایان رسید.

 

موفق و موید باشید.

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

با زبان های برنامه نویسی C# , Java , Php به صورت تخصصی کار کردم و بیشتر وقتم رو در برنامه نویسی می گذرونم علاقه زیادی به ساخت اپلیکیشن اندروید دارم.

نظرها ( ۱۷ )

  1. رها
    ۱۶, شهریور , ۱۳۹۶ در ۱۰:۰۷ ب.ظ

    سلام
    اگر بخواییم در محیط eclipse این کار را انجام بدیم باید چه کتابخانه ای را به برنامه اضافه کنیم. فایل jar مربوط به sqlcipher رو اضافه کردم اما کلاس ها رو نمیشناسه
    ممنون میشم راهنمایی کنید

    • محمد حسین جعفری پور
      ۱۶, شهریور , ۱۳۹۶ در ۱۰:۲۷ ب.ظ

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

  2. شیلا
    ۱۲, مهر , ۱۳۹۶ در ۵:۴۰ ق.ظ

    سلام من یه فایل دیتابیس با فرمت .sqlite دارم و الان رویه اپم داره کاره می کنه منظورم اینکه کلی تبل و فیلدو اطلاعات اولیه و اینجور چیزا داره حالا میخوام رو همین فایل دیتابیسم که تو پوشه asset اپم میاد رویه حافظه خارجی گوشی ینی کپی میشه میخام تبدیلش کنم به دیتابیس رمز نگاری میشه بگید باید چیکارش کنم منظورم خوده فایلی هستش که ابتدا به ساکنش رمز روش باشه و کسی نتونه بهش دسترسی داشته باشه

  3. mojtaba1376
    ۱۹, دی , ۱۳۹۶ در ۵:۵۸ ق.ظ

    با سلام

    برا دیتابیس که از اول در برنامه قرار بدیم این امکانش نیست؟؟

    • محمد حسین جعفری پور
      ۱۹, دی , ۱۳۹۶ در ۲:۱۱ ب.ظ

      خیر ولی میشه خود داده های داخلش رو کد کرد.

      • mojtaba1376
        ۱۹, دی , ۱۳۹۶ در ۴:۱۷ ب.ظ

        سلام اگر میشه راهنمایی بیشتری بکنین مرسی

        • محمد حسین جعفری پور
          ۱۹, دی , ۱۳۹۶ در ۱۰:۱۱ ب.ظ

          مثلا شما یک String به نام hossein بعد میاید این رو با یکسری کتاب خانه یا متود های رمزگذاری تبدیل می کنیدش به @sf%dGs و در دیتابیس خود insert می کنید از آنجایی که متود های رمزگذاری داری Deprecatory یا رمزنگار هستن موقع خواندن این را @sf%dGs به ورودی آن میدهد و خروجی به شما hossein تحویل میدهد.
          موفق باشید.

          • mojtaba1376
            ۲۰, دی , ۱۳۹۶ در ۴:۰۶ ب.ظ

            ممنون 🙂

            این متد ها میتونه دستی باشه یعنی میشه خودمون هم یک الگوریتم بنویسیم یا کلاس های آماده ای هم هستند؟؟

            پ ن : یک موردی در سایت اگه اضافه کنین واقعا بسیار عالی میشه
            مثلا من با نام کاربری خودم وارد سایت شدم در مثلا ۱۲ مطلب میام نظر ارسال می کنم و سوالم رو مطرح می کنم و منتظر جواب می مونم ولی بعدا که بخوام چک کنم که من در چه مطالبی نظر ارسال کردم و دوباره برم چک کنم که آیا جوابی داده شده یا نه پیدا کردنشون واقعا سخت میشه

            اگه بشه یک امکانی اضافه کنین مثلا من در این مطلب نظر ارسال کردم در پنل خودم یک لیستی از مطالبی که من در اون نظر ارسال کردم نمایش داده بشه

            با تشکر

          • محمد حسین جعفری پور
            ۲۰, دی , ۱۳۹۶ در ۵:۴۱ ب.ظ

            سلام بله می شود یک کلاس Encryption سفارشی خودتون درست کنید
            از بخش زیر می تونید استفاده کنید.
            https://programchi.ir/author/mojtaba1376/

  4. حسین
    ۲۲, شهریور , ۱۳۹۷ در ۳:۴۱ ب.ظ

    سلام.
    اگه ازین روش استفاده کنیم حجم دیتابیس و در حقیقت حجم اپمون بیشتر میشه؟ چقدر؟
    سرعت کار ها (کویری ، در ج و دیلیت و آپدیت) چقدر کم میشه؟ خیلی محسوسه؟
    من از content provider هم برای کار با دیتابیس استفاده میکنم. مشکلی که پیش نمیاد؟
    —-
    روش های دیگه چی؟ میشه کرک شده ی see و .. رو پیدا کرد؟

    • محمد حسین جعفری پور
      ۲۳, شهریور , ۱۳۹۷ در ۳:۱۳ ب.ظ

      سلام و دورد
      حجمش حدودا یک مگ میشه در بهترین حالت در بدترین جالت ۴ تا ۵ مگ سرعتش خوبه مشکلی با content provier نداره

      موفق باشید.

  5. sattar
    ۱۵, خرداد , ۱۳۹۸ در ۲:۰۲ ب.ظ

    سلام.
    من از این روش استفاده کردم اما یکجا به ارور رسیدم که در اینترنت هم به جوابی نرسیدم
    زمانی که میخوام
    SQLiteDatabase db = ModelBus.getInstance(this).getWritableDatabase(“”);
    بنویسم از قسمت زیر اشکال میگیرد که میکوید کانستراکتور این قسمت ورودی نمیپذیرد و نمیگذارد استیرینگی وارد شود
    getWritableDatabase(“؟؟؟؟؟؟”)
    ممنون میشم راهنمایی کنید مهندس جان

    • مجید
      ۱۷, خرداد , ۱۳۹۸ در ۲:۱۸ ق.ظ

      سلام
      چرا داخل پرانتز خالیه؟
      مگه بانکت پسورد نداره؟؟
      من اینجور نوشتم و جواب گرفتم
      SQLiteDatabase db = instance.getWritableDatabase(PASS_WORD);

  6. مجید
    ۱۶, خرداد , ۱۳۹۸ در ۴:۲۸ ق.ظ

    سلام
    وقت بخیر
    من یه مشکل دارم؟؟
    برنامه من روی شبیه ساز با ورژن اندروید ۴٫۴٫۴ درست اجرا میشه ، اما روی گوشی با اندروید ۷ درست اجرا نمیشه؟؟
    ممنون میشم راهنمایی کنید

  7. محمد
    ۲۳, تیر , ۱۳۹۸ در ۸:۰۹ ب.ظ

    سلام

    لطفا استفاده از sqlcipher برای دیتابیس آماده رو هم بفرمایید.

    متشکر

  8. mohammad
    ۲۱, مهر , ۱۳۹۸ در ۱۱:۱۲ ق.ظ

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

  9. اشکان
    ۳۰, مهر , ۱۳۹۸ در ۱۲:۱۶ ب.ظ

    سلام
    چرا واقعا هیچ منبع فارسی در مورد رمز نگاری روی دیتابیس اماده صحبتی نکرده لطفااااااااا به موضوع به این مهمی بپردازید!!!!!!!!!!!!!!!!!