نسخهٔ فعلی |
متن شما |
سطر ۹۵: |
سطر ۹۵: |
| برای جلوگیری از درج کلمه عبور پایگاه داده به صورت مستقیم در کد، می توانید هنگام ورود برنامه کلمه عبور رمزنگاری شده ارتباط با پایگاه داده را با اطلاعات وارد شده از طرف کاربر رمزگشایی کنید. | | برای جلوگیری از درج کلمه عبور پایگاه داده به صورت مستقیم در کد، می توانید هنگام ورود برنامه کلمه عبور رمزنگاری شده ارتباط با پایگاه داده را با اطلاعات وارد شده از طرف کاربر رمزگشایی کنید. |
| | | |
− | == Realm ==
| |
| | | |
− | پایگاه داده های Realm که به نوعی جایگزین sqlite امروز بسیار استفاده می شود.
| |
| | | |
− | کد زیر بدون رمزنگاری برای اتصال به این پایگاه داده در نظر بگیرید:
| |
| | | |
− | <div lang="en" dir="ltr" class="mw-content-ltr">
| |
− | <pre>
| |
− | RealmConfiguration realmConfig = new RealmConfiguration.Builder()
| |
− | .name("tasky.realm")
| |
− | .schemaVersion(0)
| |
− | .build();
| |
− | Realm.setDefaultConfiguration(realmConfig);
| |
− | </pre>
| |
− | </div>
| |
| | | |
− | حال کد زیر را در نظر بگیرید:
| |
| | | |
− | <div lang="en" dir="ltr" class="mw-content-ltr">
| |
− | <pre>
| |
− | RealmConfiguration config = new RealmConfiguration.Builder()
| |
− | .encryptionKey(getKey())
| |
− | .build();
| |
| | | |
− | Realm realm = Realm.getInstance(config);
| |
− | </pre>
| |
− | </div>
| |
− |
| |
− | برای getKey() هم می توان از keystore و یا از سرور درخواست کلید نمود.
| |
− |
| |
− |
| |
− | == Internal Storage ==
| |
− |
| |
− | دسترسی به internal storage به صورت پیش فرض توسط سایر برنامه ها ممکن نیست.
| |
− |
| |
− | ولی اگر ذخیره سازی داده های به صورت ناامن و به شکل زیر و استفاده از حالت های `MODE_WORLD_READABLE` و `MODE_WORLD_WRITEABLE` باشد دسترسی سایر برنامه ها به internal storage برنامه امکان پذیر است.
| |
− |
| |
− | <div lang="en" dir="ltr" class="mw-content-ltr">
| |
− | <pre>
| |
− | FileOutputStream fos = null;
| |
− | try {
| |
− | fos = openFileOutput(FILENAME, Context.MODE_WORLD_READABLE);
| |
− | fos.write(test.getBytes());
| |
− | fos.close();
| |
− | } catch (FileNotFoundException e) {
| |
− | e.printStackTrace();
| |
− | } catch (IOException e) {
| |
− | e.printStackTrace();
| |
− | }
| |
− | </pre>
| |
− | </div>
| |
− |
| |
− | حالت امن تر استفاده از MODE_PRIVATE در ذخیره سازی است.
| |
− |
| |
− | <div lang="en" dir="ltr" class="mw-content-ltr">
| |
− | <pre>
| |
− | FileOutputStream fos = null;
| |
− | try {
| |
− | fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
| |
− | fos.write(test.getBytes());
| |
− | fos.close();
| |
− | } catch (FileNotFoundException e) {
| |
− | e.printStackTrace();
| |
− | } catch (IOException e) {
| |
− | e.printStackTrace();
| |
− | }
| |
− | </pre>
| |
− | </div>
| |
− |
| |
− | == External Storage ==
| |
− |
| |
− | می توان داد ها را در دستگاه های جانبی مانند SD Card ذخیره نمود.
| |
− |
| |
− | ولی هنگام write بر روی دستگاه های جانبی فایلی در این مسیر ایجاد خواهد شد:
| |
− |
| |
− | <div lang="en" dir="ltr" class="mw-content-ltr">
| |
− | <pre>
| |
− | /sdcard/Android/data/com.company.app/files/save/appdata/save_appdata
| |
− | </pre>
| |
− | </div>
| |
− |
| |
− | کد زیر را در نظر بگیرید:
| |
− |
| |
− | <div lang="en" dir="ltr" class="mw-content-ltr">
| |
− | <pre>
| |
− | private String filename = "myfile"
| |
− |
| |
− | private String string = "sensitive data such as credit card number"
| |
− | FileOutputStream fos = null;
| |
− |
| |
− | try {
| |
− | File file = new File(getExternalFilesDir(TARGET_TYPE), filename);
| |
− | fos = new FileOutputStream(file, false);
| |
− | fos.write(string.getBytes());
| |
− | } catch (FileNotFoundException e) {
| |
− | // handle FileNotFoundException
| |
− | } catch (IOException e) {
| |
− | // handle IOException
| |
− | } finally {
| |
− | if (fos != null) {
| |
− | try {
| |
− | fos.close();
| |
− | } catch (IOException e) {
| |
− | // handle error
| |
− | }
| |
− | }
| |
− | }
| |
− | </pre>
| |
− | </div>
| |
− |
| |
− | برای جلوگیری از این آسیب پذیری می توان از openFileOutput و حالت MODE_PRIVATE به صورت زیر استفاد نمود:
| |
− |
| |
− | <div lang="en" dir="ltr" class="mw-content-ltr">
| |
− | <pre>
| |
− | private String filename = "myfile"
| |
− | private String string = "sensitive data such as credit card number"
| |
− | FileOutputStream fos = null;
| |
− |
| |
− | try {
| |
− | fos = openFileOutput(filename, Context.MODE_PRIVATE);
| |
− | fos.write(string.getBytes());
| |
− | fos.close();
| |
− | } catch (FileNotFoundException e) {
| |
− | // handle FileNotFoundException
| |
− | } catch (IOException e) {
| |
− | // handle IOException
| |
− | } finally {
| |
− | if (fos != null) {
| |
− | try {
| |
− | fos.close();
| |
− | } catch (IOException e) {
| |
− | // handle error
| |
− | }
| |
− | }
| |
− | }
| |
− | </pre>
| |
− | </div>
| |
| | | |
| | | |
| [[category:ذخیره سازی ناامن داده(Insecure Data Storage)]] | | [[category:ذخیره سازی ناامن داده(Insecure Data Storage)]] |