5 Haziran 2020 Cuma

Android’de SQLite Veritabanı Şifreleme

Android’de SQLite Veritabanı 
Şifreleme

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’deEncryption (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.

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ı

Ö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 metotlarımızı kodladık.
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ğerleri de 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 (yenileme)yapmadığım için eklediğiniz değerleri uygulamayı, kapatıp yeniden açtığınızda göreceksiniz.
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;
    }
}


Kaynaklar

Hiç yorum yok:

Yorum Gönder

SwiftUI İçin Özel Sayfalar

  SwiftUI İçin Özel Sayfalar Hiç SwiftUI'da dinamik yüksekliğe sahip özel bir sayfa oluşturmak istediniz mi? Apple yerel bir Sayfa bil...