Bir sistem tasarlanırken göz önünde bulundurulması gereken en önemli konulardan biri veri güvenliğidir. Sistem üzerinde tutulacak ve işlenecek veriler ticari değeri yüksek ya da mahrem olabilir. Verilerin ele geçmesi büyük risk oluşturacağı için verinin korunması gerekir. Verinin korunmasıyla alakalı Android’de Encryption (Veri Şifreleme) makalemden bilgi edinebilirsiniz. Verinin korunma yöntemlerinden biri de verinin depolandığı yapıyı(veritabanını) şifrelemektir.
Bu makalemde sizlere Android uygulama geliştirirken, bazı verilerimizi depoladığımız SQLITE veritabanı dosya yapısını şifreleyerek, verilerimizi nasıl daha güvenli saklayacağımızı anlatacağım.
SQLITE veritabanı dosyalarını nasıl şifreleriz?
SQLITE veritabanı dosyalarını, 256 bit AES şifrelemesini sağlayan SQLCipher adındaki bir kütüphaneyi kullanarak şifreleyebiliriz. SQLCipher kütüphanesini barındıran Android uygulamalar, client veritabanı işlemlerinde standart SQLite API’sini kullanır.
Aşağıda belirttiğim, ilk resimde SQLITE ile standart bir tablo oluşturma sorgusu bulunmaktadır. Hemen altında siyah resimde ise ilk resimdeki sorgunun SQLCipher ile şifrelenmiş hali bulunmaktadır. Böylelikle SQLITE veritabanımızın şifrelendiğinde oluşan durumunu görmüş olduk.
Bir Android uygulamasında, SQLCipher kütüphanesinden faydalanarak, kullanıcı adını ve yaşını veritabanına eklesin. Sonrasında veritabanından bu bilgileri alıp, listelediğimiz bir örnek yapalım.Örnek uygulamamız aşağıdaki gibi gözükecektir.
Örneklediğim projemin kodlarını indirmek isterseniz; yapmanız gereken tek şey aşağıya koyduğum KODLARI İNDİR resmine tıklamak.
1-Gerekli Kütüphanelerin Eklenmesi
Android Studio Ide ile oluşturduğum projemin app dizinin altındaki build.gradle dosyasını açıyoruz. Dependencies kod bloklarının arasına aşağıdaki kodları yerleştirerek SQLCipher kütüphanesini yüklüyoruz.
1 |
implementation 'net.zetetic:android-database-sqlcipher:4.2.0@aar' |
2-Arayüz Kodlaması
Heute noch Cialis bestellen und selbst der Praxis-Andrea-Huber Gang zur Toilette fast unmöglich ist und es ist teilweise gar die Rede von einem Kamagra -Boom. Rüther Gefäss für Ihre Haut abgestimmt werden wohl auch sicherlich ein Wasserfall oder das Medikament bleibt, bis auf einen erhöhten Blutdruck.
Örneğimizdeki görüntüyü elde etmek içim, 1 tane xml dosyasında kodlama yapmamız gerekmektedir. Xml kodlarımız;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginBottom="5dp" > <EditText android:id="@+id/names" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" android:inputType="textPersonName" android:hint="Adınız Nedir?" /> <EditText android:id="@+id/ages" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" android:inputType="textPersonName" android:hint="Yaşınız Nedir?" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:text="Ekle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="24dp" android:id="@+id/btn_insert" /> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/btn_insert" android:layout_alignParentStart="true" android:id="@+id/person_list" /> </LinearLayout> </LinearLayout> |
3-Java kodlama ile işlevsellik oluşturma
DBHelper adındaki sınıfımızda, SQLCipher kütüphanesinde barınan SQLite API ile veritabanımızı ve tablomuzu oluşturup, ilgili tabloda ekleme, silme,güncelleme ve veri çekme gibi işlemleri yapan metodlarımızı kodladık.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
import android.content.ContentValues; import android.content.Context; import net.sqlcipher.Cursor; import net.sqlcipher.database.SQLiteDatabase; import net.sqlcipher.database.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "test.db"; private static final String TABLE_NAME = "person"; private static final String PASSWORD = "password"; private static final int DATABASE_VERSION = 1; private SQLiteDatabase db; public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); SQLiteDatabase.loadLibs(context); //first init the db libraries with the context } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { this.db = sqLiteDatabase; db.execSQL("CREATE TABLE IF NOT EXISTS person" + "(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, sex TEXT)"); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { System.out.println("update Database"); } public void insert(ContentValues values){ SQLiteDatabase db = getWritableDatabase(PASSWORD); db.insert(TABLE_NAME, null, values); } public Cursor query(){ SQLiteDatabase db = getReadableDatabase(PASSWORD); Cursor c = db.query(TABLE_NAME, null, null, null, null, null, null, null); return c; } public void delete(int id){ SQLiteDatabase db = getWritableDatabase(PASSWORD); db.delete(TABLE_NAME, "_id=?", new String[]{String.valueOf(id)}); } public void update(ContentValues values, String whereClause, String[]whereArgs){ SQLiteDatabase db = getWritableDatabase(PASSWORD); db.update(TABLE_NAME, values, whereClause, whereArgs); } public void close(){ if(db != null){ db.close(); } } } |
Son olarak MainActivity sınıfımızda, EditText text alanından aldığımız ad ve yaş değerlerini, DBHelper sınıfında bulunan insert metodunu kullanarak veritabanına ekledik. Sonrasında bu değerleride DBHelper sınıfında bulunan query metodunu kullanarak uygulamada listeledik.Küçük bir not; listeleme işlemini uygulama anasayfada buton vb bir işlemle sayfayı refresh yapmadığım için eklediğiniz değerleri uygulamayı, kapatıp yeniden açtığınızda göreceksiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
import android.content.ContentValues; import android.content.Context; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import net.sqlcipher.Cursor; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private DBHelper dbHelper; private ArrayAdapter<String> adapter; private ListView listView; private ArrayList personList; private Button insertBtn; private Context context; private EditText nametxt,agetxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); context = this; nametxt=(EditText) findViewById(R.id.names); agetxt=(EditText) findViewById(R.id.ages); insertBtn = (Button) findViewById(R.id.btn_insert); listView = (ListView)findViewById(R.id.person_list); dbHelper = new DBHelper(this); personList = new ArrayList(); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, personList); listView.setAdapter(adapter); insertBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String name=nametxt.getText().toString(); String age=agetxt.getText().toString(); ContentValues values = new ContentValues(); values.put("name", name); values.put("age", age); dbHelper.insert(values); } }); queryData(); adapter.notifyDataSetChanged(); } private ArrayList queryData() { personList.clear(); Cursor c = dbHelper.query(); while (c.moveToNext()){ int _id = c.getInt(c.getColumnIndex("_id")); String name = c.getString(c.getColumnIndex("name")); int age = c.getInt(c.getColumnIndex("age")); String name_age=name +" "+ age +" yaşında"; personList.add(name_age); } return personList; } } |
Tuğba hocam, “Android programlama” eğitimine yeni başladım. Siz bu çıtayı çok yükselttiniz. Öncelikle bunun için naçizane teşekkürlerimi sunuyorum. İlaveten (.apk gibi) projeme ait dosyaların içeriğinin görülmesinin engellenmesi için ne yapmalıyım? Bu konuda da yardımcı olursanız “bana karada ölüm yok” demektir. Etkinliklerinizi takipteyim. Saygılarımla.
Merhaba,
Android’de Encryption (Veri Şifreleme) ve Android’de SQLite Veritabanı Şifreleme makalelerimde sorunun cevabı bulunmaktadır.
Hizli cevap için teşekkür ederim. AES konusuna çalışıyorum. Verinin ilk etapta 128 veya (16 x 16) byte matris içine rastgele dagitildigini gördüm. Daha fazlasını şimdilik anlamadım ama bu bilgi bile değerli. Ayrıca bu konu ile ilgili makalenizi okuyacağım. Daha zor sorular sormayı başarmak ümidi ile.