How to use Facebook Conceal Method to Encrypt your data like password before storing in SQLite Database in Android? – Complete source code

In this video, it is showns how one can encrypt the data using the Facebook Conceal encryption method. To demonstrate the same it takes the example of storing critical data such as password in SQLite database. So, this video will also be useful for someone who needs to understand how to work with SQLite database.

For other encryption method like AES, you can refer to my below video which shows the steps to “Create Android chat message App with End to End AES(Advanced Encryption Standard) method in Firebase”

The Facebbok Conceal Method files such library jar files, packages, etc. used in the video can be found below. These files can also be sent on demand. Please write to: programmerworld1990@gmail.com

facebook – Unzip and Place it at MyFacebookConcealEncrypt\app\src\main\java\com

libs – Unzip and Place it at MyFacebookConcealEncrypt\app folder.

Source Code:

package com.example.myfacebookconcealencrypt;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class mySQLLiteHandle extends SQLiteOpenHelper {
    public mySQLLiteHandle(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}
package com.example.myfacebookconcealencrypt;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import com.facebook.android.crypto.keychain.SharedPrefsBackedKeyChain;
import com.facebook.crypto.Crypto;
import com.facebook.crypto.CryptoConfig;
import com.facebook.crypto.Entity;
import com.facebook.crypto.exception.CryptoInitializationException;
import com.facebook.crypto.exception.KeyChainException;
import com.facebook.crypto.util.SystemNativeCryptoLibrary;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

public class MainActivity extends AppCompatActivity {

    private mySQLLiteHandle dbHandle;
    private SQLiteDatabase sqLiteDatabase;

    private EditText editTextKey;
    private EditText editTextPassword;

    private TextView textViewRetrievePassword;
    private TextView textViewStoredPassword;

    private Entity entity = new Entity("password"); //Key for Facebook Conceal Method

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextKey = findViewById(R.id.editTextKey);
        editTextPassword = findViewById(R.id.editTextPwd);

        textViewRetrievePassword = findViewById(R.id.textViewActualPwd);
        textViewStoredPassword = findViewById(R.id.textViewEncryptedPwd);

        try{

            dbHandle = new mySQLLiteHandle(this, "PassWordStorage", null, 1);
            sqLiteDatabase = dbHandle.getWritableDatabase();
            sqLiteDatabase.execSQL("CREATE TABLE PasswordTable(Keyword TEXT, Password, TEXT)");
        }
        catch (Exception e){
            e.printStackTrace();
        }


    }

    public void WriteDatabase(View view){
        Crypto crypto = new Crypto(new SharedPrefsBackedKeyChain(this, CryptoConfig.KEY_256),
                new SystemNativeCryptoLibrary(), CryptoConfig.KEY_256);

        byte[] ciphertext = null;

        try {
            ciphertext = crypto.encrypt(editTextPassword.getText().toString().getBytes(), entity);
        } catch (KeyChainException e) {
            e.printStackTrace();
        } catch (CryptoInitializationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        ContentValues contentValues = new ContentValues();

        contentValues.put("Keyword", editTextKey.getText().toString());

        String finalString = null;
        try {
            finalString = new String(ciphertext, "ISO-8859-1");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        contentValues.put("Password", finalString);

        sqLiteDatabase.insert("PasswordTable", null, contentValues);
        sqLiteDatabase.update("PasswordTable",contentValues, null, null);
    }

    public void RetrievePassword(View view){

        String query = "Select Password from PasswordTable where Keyword = " +"\"" + editTextKey.getText().toString() + "\"";
        Cursor cursor = sqLiteDatabase.rawQuery(query, null);
        cursor.moveToFirst();
        String finalString =  cursor.getString(0);

        try {
            byte[] cipherText = cursor.getString(0).getBytes("ISO-8859-1");

            Crypto crypto = new Crypto(new SharedPrefsBackedKeyChain(this, CryptoConfig.KEY_256),
                    new SystemNativeCryptoLibrary(), CryptoConfig.KEY_256);

            finalString = new String(crypto.decrypt(cipherText, entity));


        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (KeyChainException e) {
            e.printStackTrace();
        } catch (CryptoInitializationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        textViewRetrievePassword.setText(finalString);

    }

    public void EncryptedPassword(View view){
        String query = "Select Password from PasswordTable where Keyword = " +"\"" + editTextKey.getText().toString() + "\"";
        Cursor cursor = sqLiteDatabase.rawQuery(query, null);
        cursor.moveToFirst();
        textViewStoredPassword.setText(cursor.getString(0));

    }
}

We will be glad to hear from you regarding any query, suggestions or appreciations at: programmerworld1990@gmail.com

7 comments

  1. Getting this error
    com.facebook.crypto.exception.CryptoInitializationException: java.lang.UnsatisfiedLinkError

    How to fix it ?

    1. I think there is some issue in importing all the libraries needed for this project.

      The library files are shared in this web-page.

      You can also access them using below links:
      https://programmerworld.co/wp-content/uploads/2019/10/facebook.zip
      https://programmerworld.co/wp-content/uploads/2019/10/libs.zip

      Once the libraries are included in the project as shown in the video, these errors should not appear.

      Cheers
      Programmer World
      https://programmerworld.co/

Leave a Reply

%d bloggers like this: