ورود

View Full Version : محافظت ار دیتابیس



poorman
یک شنبه 03 فروردین 1393, 19:09 عصر
سلام دوستان

من برنامه ای که دارم میسازم یک دیتابیس آماده داره، اطلاعاتش خیلی مهم نیست، اما دوست ندارم این دیتابیس در دسترس بقیه قرار بگیره چون براش خیلی زحمت کشیدم
آیا راهی هست که بشه دیتابیس رو رمزگذاری کرد ؟ ( ترجیحا هم آسون باشه :لبخند: )

مرسی

mfaridi
یک شنبه 03 فروردین 1393, 19:33 عصر
میتونی برای محتویاتش کلید بسازی که مثلا توی دیتابست به صورت رمز هست و وقتی بیرونش میاری با کلید خودت بیرون میاری
البته شاید این راه راه درست و منتقی نباشه ولی 100 در 100 امنیتش خیلی بالا میره و کسی نمیتونه چیزی از محتواش بفهمه

poorman
یک شنبه 03 فروردین 1393, 20:03 عصر
ممنون، چطور این کار رو باید انجام بدم ؟

من رفتم چند تا از برنامه های کتاب رایگان داخل بازار رو دانلود کردم روی ایمولاتور نصب کردم، برام جالب بود که این برنامه ها یا دیتابیس نداشتن، یا دیتابیسشون خالی بود !!!
چطور امکان داره ؟؟؟ یعنی محتوا رو توی خود برنامه نوشتن ؟؟؟ :لبخند:

smemamian
یک شنبه 03 فروردین 1393, 20:57 عصر
می تونی از sqlcipher (http://sqlcipher.net/sqlcipher-for-android/)استفاده کنی.

mfaridi
یک شنبه 03 فروردین 1393, 20:59 عصر
حرف ها رو در هم بریز و با رمز خود بیرون بیار من قبلا همین رو برای پروژه دانشگاهمون نوشتم حالا وقت شد دوباره مینویسم
امیدوارم این لینک بهت کمک کنه برو قسمت
رمزنگاری کلید خصوصی(Private Key ) http://fa.wikipedia.org/wiki/رمز_و_رمزنگاری#.D8.B1.D9.85.D8.B2.D9.8 6.DA.AF.D8.A7.D8.B1.DB.8C_.DA.A9.D9.84.DB.8C.D8.AF _.D8.AE.D8.B5.D9.88.D8.B5.DB.8C.28Private_Key_.29

poorman
یک شنبه 03 فروردین 1393, 23:18 عصر
حرف ها رو در هم بریز و با رمز خود بیرون بیار من قبلا همین رو برای پروژه دانشگاهمون نوشتم حالا وقت شد دوباره مینویسم
امیدوارم این لینک بهت کمک کنه برو قسمت
رمزنگاری کلید خصوصی(Private Key )

http://fa.wikipedia.org/wiki/رمز_و_رمزنگاری#.D8.B1.D9.85.D8.B2.D9.8 6.DA.AF.D8.A7.D8.B1.DB.8C_.DA.A9.D9.84.DB.8C.D8.AF _.D8.AE.D8.B5.D9.88.D8.B5.DB.8C.28Private_Key_.29

والا مطالب بیشتر تئوری بود، چیز خاصی دستگیرم نشد
اینکه بخوام از الگوریتم های رمزگذاری استفاده کنم هم فک نکنم کار خیلی آسونی باشه ، دردسرهای خاص خودش رو داره !!!
مرسی بازم :لبخندساده:

poorman
یک شنبه 03 فروردین 1393, 23:19 عصر
می تونی از sqlcipher (http://sqlcipher.net/sqlcipher-for-android/)استفاده کنی.

توی فروم های خارجی هم دیدم این رو معرفی کرده بودن، اما گفتم بگردم شاید یک راه ساده تر پیدا شد

حالا میشه یک توضیح در مورد نحوه کار sqlcipher بدید ؟

hamedjj
یک شنبه 03 فروردین 1393, 23:58 عصر
توی فروم های خارجی هم دیدم این رو معرفی کرده بودن، اما گفتم بگردم شاید یک راه ساده تر پیدا شد

حالا میشه یک توضیح در مورد نحوه کار sqlcipher بدید ؟

poorman (http://barnamenevis.org/member.php?295320-poorman) جان من قبلا به یه پروژه تو github برخوردم که فکر کنم بدردت بخوره
از sqlciher استفاده میکنه.
هنوز هم باهاش کار نکردم که بدونم چی هست
اگه همونیه که دنبالشی تو همین تاپیک یه اطلاع بده
https://github.com/hamedjj/cwac-prefs

smemamian
دوشنبه 04 فروردین 1393, 00:03 صبح
تمامی فایل های assets/ و libs/ به پروژه ات کپی/پیس کن.
بعدش به صورت زیر فراخونی کن :

package com.demo.sqlcipher;

import java.io.File;
import net.sqlcipher.database.SQLiteDatabase;
import android.app.Activity;
import android.os.Bundle;

public class HelloSQLCipherActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
InitializeSQLCipher();
}

private void InitializeSQLCipher() {
SQLiteDatabase.loadLibs(this);
File databaseFile = getDatabasePath("demo.db");
databaseFile.mkdirs();
databaseFile.delete();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null);
database.execSQL("create table t1(a, b)");
database.execSQL("insert into t1(a, b) values(?, ?)", new Object[]{"one for the money",
"two for the show"});
}
}

فقط حواست به تابع زیر باشه که قبل از هر کاری فراخوانی کنی:
SQLiteDatabase.loadLibs(this)
عملیات رمزگذاری/رمز گشایی رو خودش انجام میده.

smemamian
دوشنبه 04 فروردین 1393, 00:05 صبح
همین طور که @hamedjj (http://barnamenevis.org/member.php?290105-hamedjj) اشاره کردن، می تونید از همون مثال استفاده کنید که
کلاس دیتابیس رو به صورت زیر نوشته :

/***
Copyright (c) 2008-2012 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.

From _The Busy Coder's Guide to Android Development_
http://commonsware.com/Android
*/

package com.commonsware.android.constants;

import android.content.ContentValues;
import android.content.Context;
import android.hardware.SensorManager;
import java.io.File;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME="constants-crypt.db";
private static final String LEGACY_DATABASE_NAME="constants.db";
private static final String PASSPHRASE="this is a secret";
private static final int SCHEMA=1;
static final String TITLE="title";
static final String VALUE="value";
static final String TABLE="constants";

static void encrypt(Context ctxt) {
SQLiteDatabase.loadLibs(ctxt);

File dbFile=ctxt.getDatabasePath(DATABASE_NAME);
File legacyFile=ctxt.getDatabasePath(LEGACY_DATABASE_NA ME);

if (!dbFile.exists() && legacyFile.exists()) {
SQLiteDatabase db=
SQLiteDatabase.openOrCreateDatabase(legacyFile, "", null);

db.rawExecSQL(String.format("ATTACH DATABASE '%s' AS encrypted KEY '%s';",
dbFile.getAbsolutePath(), PASSPHRASE));
db.rawExecSQL("SELECT sqlcipher_export('encrypted')");
db.rawExecSQL("DETACH DATABASE encrypted;");

int version=db.getVersion();

db.close();

db=SQLiteDatabase.openOrCreateDatabase(dbFile, PASSPHRASE, null);
db.setVersion(version);
db.close();

legacyFile.delete();
}
}

public DatabaseHelper(Context ctxt) {
super(ctxt, DATABASE_NAME, null, SCHEMA);
}

@Override
public void onCreate(SQLiteDatabase db) {
try {
db.beginTransaction();
db.execSQL("CREATE TABLE constants (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, value REAL);");

ContentValues cv=new ContentValues();

cv.put(TITLE, "Gravity, Death Star I");
cv.put(VALUE, SensorManager.GRAVITY_DEATH_STAR_I);
db.insert("constants", TITLE, cv);

cv.put(TITLE, "Gravity, Earth");
cv.put(VALUE, SensorManager.GRAVITY_EARTH);
db.insert("constants", TITLE, cv);

cv.put(TITLE, "Gravity, Jupiter");
cv.put(VALUE, SensorManager.GRAVITY_JUPITER);
db.insert("constants", TITLE, cv);

cv.put(TITLE, "Gravity, Mars");
cv.put(VALUE, SensorManager.GRAVITY_MARS);
db.insert("constants", TITLE, cv);

cv.put(TITLE, "Gravity, Mercury");
cv.put(VALUE, SensorManager.GRAVITY_MERCURY);
db.insert("constants", TITLE, cv);

cv.put(TITLE, "Gravity, Moon");
cv.put(VALUE, SensorManager.GRAVITY_MOON);
db.insert("constants", TITLE, cv);

cv.put(TITLE, "Gravity, Neptune");
cv.put(VALUE, SensorManager.GRAVITY_NEPTUNE);
db.insert("constants", TITLE, cv);

cv.put(TITLE, "Gravity, Pluto");
cv.put(VALUE, SensorManager.GRAVITY_PLUTO);
db.insert("constants", TITLE, cv);

cv.put(TITLE, "Gravity, Saturn");
cv.put(VALUE, SensorManager.GRAVITY_SATURN);
db.insert("constants", TITLE, cv);

cv.put(TITLE, "Gravity, Sun");
cv.put(VALUE, SensorManager.GRAVITY_SUN);
db.insert("constants", TITLE, cv);

cv.put(TITLE, "Gravity, The Island");
cv.put(VALUE, SensorManager.GRAVITY_THE_ISLAND);
db.insert("constants", TITLE, cv);

cv.put(TITLE, "Gravity, Uranus");
cv.put(VALUE, SensorManager.GRAVITY_URANUS);
db.insert("constants", TITLE, cv);

cv.put(TITLE, "Gravity, Venus");
cv.put(VALUE, SensorManager.GRAVITY_VENUS);
db.insert("constants", TITLE, cv);

db.setTransactionSuccessful();
}
finally {
db.endTransaction();
}
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {
throw new RuntimeException("How did we get here?");
}

SQLiteDatabase getReadableDatabase() {
return(super.getReadableDatabase(PASSPHRASE));
}

SQLiteDatabase getWritableDatabase() {
return(super.getWritableDatabase(PASSPHRASE));
}
}

poorman
دوشنبه 04 فروردین 1393, 01:03 صبح
ممنون
ولی اونطور که من متوجه شدم اینجا داره کلا یک دیتابیس رو ایجاد میکنه و رمزگذاری میکنه

دیتابیس من آماده هست، چیزی توش وارد نمیکنم، فقط میخوام ازش اطلاعات بخونم و با لایبری sqlAssetHelper فراخوانی میشه ، توی این مورد هم میشه ازش استفاده کرد ؟؟؟

smemamian
دوشنبه 04 فروردین 1393, 01:16 صبح
ساختار دیتابیس sqlciher با ساختار دیتابیس درونی اندورید متفاوت هستش.
یه کم کارت پیچیده میشه و فکر کنم ارزش این همه پیچیدگی رو نداشته باشه.
ایده کلی می تونه این باشه:
شما باید ابتدا به صورت پیش فرض یه دیتابیس از sqlciher بسازید.
سپس داده هارو از دیتابیس assets به دیتابیس sqlciher کپی می کنید.
و بعد کدهاتون رو باید طوری بنویسید که از این به بعد از دیتابیس sqlciher
استفاده کنه.

poorman
دوشنبه 04 فروردین 1393, 02:34 صبح
من همونطور که گفتم چند تا از نرم افزارهای کتاب توی بازار رو روی ایمولاتور نصب کردم
اکثرشون توی پوشه برنامه، پوشه database نداشتن، یعنی کلا دیتابیسشون مخفی بود و توی پوشه برنامه تنها یک پوشه lib بود
برای من در همین حد کافیه که دیتابیسم به این تابلویی در دسترس نباشه :لبخند:

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

jafaripur
دوشنبه 04 فروردین 1393, 11:27 صبح
خودت می تونی دیتابیس خودت رو بهم بریزی و رابطه درست کنی و ارتباط ها رو خودت رمز کنی، البته باید کاری کنی که الگوریتم رمزت لو نره.
استفاده از sqlcipher به صرفه نیست، اینجا هیشکی استفاده نکرده که می میگه ازش استفاده من، اولا sqlcipher رو اضافه کنی به برنامت خاطرم نیست ولی فکر کنم یک 10 مگابایتی برات آب می خوره، دیتابیس خودت هم فشرده نمی شه!
به نظر من دنبال راه های دیگه باش.

barnamenevisjavan
دوشنبه 04 فروردین 1393, 13:58 عصر
Sqlcipher بدرد نمیخوره چون نمیتونه دیتابیس آماده رو قفل کنه.مشکل دیگه اینکه این کتابخونه خود اطلاعات رو رمزگذاری میکنه ن دیتابیس رو

poorman
دوشنبه 04 فروردین 1393, 14:26 عصر
دیشب منم داشتم به همین موضوع فکر میکردم
خب وقتی من با sqlcipher دیتابیسم رو رمزنگاری کنم، یکی دیگه میاد با همین sqlcipher دیتابیس من رو باز میکنه دیگه
عملا هیچ فرقی نداره :لبخند:

smemamian
دوشنبه 04 فروردین 1393, 14:50 عصر
@jafaripur (http://barnamenevis.org/member.php?25187-jafaripur)


اولا sqlcipher رو اضافه کنی به برنامت خاطرم نیست ولی فکر کنم یک 10 مگابایتی برات آب می خوره،

خب مشخص هست و باید هم همینطور باشه. شما برای من فقط و فقط نام کاربری خودتون رو رمزگذاری کنید!! حجم آن
دو/چند برابر خواهد شد.

@barnamenevisjavan (http://barnamenevis.org/member.php?205725-barnamenevisjavan) :


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

محتویات یک دیتابیس چیست ؟ داده.
فرض کنید من فایل yourdatabase.db شما را در اختیار دارم. وقتی اطلاعات اون دیتابیس رمز شده است، yourdatanase.db برای من چه ارزشی
داره ؟
شما حتی نمی تونید به اطلاعات دیتابیس اطلاعاتی اضافه کنید! ولی بدون استفاده از الگوریتم های رمزنگاری، این کار خیلی ساده انجام میشه.
(بازی هایی که دارای امتیاز هستند رو در نظر بگیرید...)


@poorman (http://barnamenevis.org/member.php?295320-poorman)

دیشب منم داشتم به همین موضوع فکر میکردم
خب وقتی من با sqlcipher دیتابیسم رو رمزنگاری کنم، یکی دیگه میاد با همین sqlcipher دیتابیس من رو باز میکنه دیگه
عملا هیچ فرقی نداره :لبخند:
خیر. دیتابیس اصلی شما حتی اگر هم کپی بشه، محتویات داخلی اون قابل استفاده نیست:


if two databases are created using the same password, they will not have the same encryption key.


مطالعه کنید.


(http://sqlcipher.net/design/)

mfaridi
دوشنبه 04 فروردین 1393, 14:57 عصر
sqlcipher از همون روشی که من گفتم برای رمز نگاری استفاده میکنه پس به نظر من بهتره خودت الگوریتم رمز نگاری بنویسی

jafaripur
دوشنبه 04 فروردین 1393, 16:33 عصر
چرا خودتون رو خسته می کنید، sqlcipher از رمزنگاری AES 128 یا AES 256 بیت استفاده می کند و رمز هم توی برنامه باید باشه تا بتونی با دیتابیس کار کنی!
هر کی می گه این روش توی آندروید کاملا امنیت رو تامین می کنه یک تست درست کنه، و فایل APK رو بده من، من 90% اطلاعات رو استخراج می کنم، این کارها بیهوده هستش، می تونی از این روش استفاده کنی ولی کنار یک روش دیگر که نشه کرک کرد که اونم بهش فکر کن شاید فهمیدی چطوری :بامزه:
کلاً sqlcipher یک روش بیهوده ای هستش! از این روش های بهتری هستش که تکنیکی هستش و خودت می تونی پیاده سازی بکنیش!

jafaripur
دوشنبه 04 فروردین 1393, 16:34 عصر
@jafaripur (http://barnamenevis.org/member.php?25187-jafaripur)


خب مشخص هست و باید هم همینطور باشه. شما برای من فقط و فقط نام کاربری خودتون رو رمزگذاری کنید!! حجم آن
دو/چند برابر خواهد شد.

@barnamenevisjavan (http://barnamenevis.org/member.php?205725-barnamenevisjavan) :

محتویات یک دیتابیس چیست ؟ داده.
فرض کنید من فایل yourdatabase.db شما را در اختیار دارم. وقتی اطلاعات اون دیتابیس رمز شده است، yourdatanase.db برای من چه ارزشی
داره ؟
شما حتی نمی تونید به اطلاعات دیتابیس اطلاعاتی اضافه کنید! ولی بدون استفاده از الگوریتم های رمزنگاری، این کار خیلی ساده انجام میشه.
(بازی هایی که دارای امتیاز هستند رو در نظر بگیرید...)


@poorman (http://barnamenevis.org/member.php?295320-poorman)

خیر. دیتابیس اصلی شما حتی اگر هم کپی بشه، محتویات داخلی اون قابل استفاده نیست:

مطالعه کنید.


(http://sqlcipher.net/design/)

قربان شما فکر کنم با sqlcipher کار نکردید! مشکل در رمزنگاری نیست فایل هایی هستش که باید بزاری کنار برنامت (Locality...) و اینا ...

Winter_Man
یک شنبه 25 مرداد 1394, 08:00 صبح
دوستان چرا بحث الکی میکنید:لبخند:
اقا یکی به من توضیح بده چطوری نوشته های دیتابیسمو درهم برهم کنم؟ بعد چطوری کی بزنم براش تو برنامم؟ کمک کنید لطفا:متفکر:
من دیتابیسم توش اطلاعات محاسباتی نداره ولی کلی اطلاعات نوشتاری داره که ساعت ها وقت صرف جمع اوریش کردم حیف ه یکی دیگه مفت استفاده کنه::اشتباه:
این همه برنامه نویس تو بازار دقیقا چیکار میکنن پس؟

gilas1368
یک شنبه 25 مرداد 1394, 09:48 صبح
اساتید همه بیان کردن
sqlcipher ساختارش با sqllite متفاوته و باعث سردرگمی میشه
پس بهترین راه رمزنگاری داده های
اینجا (http://stackoverflow.com/questions/2203987/android-database-encryption) شما میتونید کلاس های مربوط ب انجام این کار رو داشته باشید

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

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

پس بنظر من اگر اطلاعاتتون اونقدر ارزش نداره رمزنگاریشون نکنین