रोकने के लिए डेटाबेस को एन्क्रिप्ट किया गया है INDIRECT ATTACKS
। यह शब्द और कक्षाएं: KeyManager.java , Crypto.java को Sheran Gunasekera की पुस्तक Android Apps Security से लिया गया है । मैं यह सब पुस्तक पढ़ने की सलाह देता हूं।
INDIRECT ATTACKS
इसलिए इसका नाम रखा गया है, क्योंकि वायरस सीधे आपके आवेदन के बाद नहीं जाता है। इसके बजाय, यह एंड्रॉइड ओएस के बाद जाता है। उद्देश्य सभी SQLite डेटाबेस को इस उम्मीद में कॉपी करना है कि वायरस लेखक वहां संग्रहीत किसी भी संवेदनशील जानकारी को कॉपी कर सकता है। यदि आपने सुरक्षा की एक और परत जोड़ दी है, तो सभी वायरस लेखक को डेटा की गड़बड़ी दिखाई देगी। आइए एक क्रिप्टोग्राफिक लाइब्रेरी का निर्माण करें जिसे हम अपने सभी अनुप्रयोगों में पुन: उपयोग कर सकते हैं। चलो विनिर्देशों का एक संक्षिप्त सेट बनाकर शुरू करते हैं:
सममित एल्गोरिदम का उपयोग करता है: हमारा पुस्तकालय हमारे डेटा को एन्क्रिप्ट और डिक्रिप्ट करने के लिए एक सममित एल्गोरिथ्म या सिफर का उपयोग करेगा। हम एईएस पर समझौता करेंगे, हालांकि हमें बाद की तारीख में इसे संशोधित करने में सक्षम होना चाहिए।
एक निश्चित कुंजी का उपयोग करता है: हमें एक कुंजी को शामिल करने में सक्षम होना चाहिए जिसे हम उस डिवाइस पर संग्रहीत कर सकते हैं जिसका उपयोग डेटा एन्क्रिप्ट और डिक्रिप्ट करने के लिए किया जाएगा।
डिवाइस पर संग्रहीत कुंजी: डिवाइस पर कुंजी निवास करेगी। हालांकि यह प्रत्यक्ष हमलों के परिप्रेक्ष्य से हमारे आवेदन के लिए एक जोखिम है, लेकिन हमें अप्रत्यक्ष हमलों से बचाने के लिए यह पर्याप्त होना चाहिए।
आइए हमारे प्रमुख प्रबंधन मॉड्यूल के साथ शुरू करें ( सूची 1 देखें )। क्योंकि हम एक निश्चित कुंजी का उपयोग करने की योजना बनाते हैं, इसलिए हमें एक यादृच्छिक उत्पन्न करने की आवश्यकता नहीं होगी जैसा कि हमने पिछले उदाहरणों में किया था। KeyManager इसलिए निम्न कार्य करने होंगे:
- पैरामीटर (
setId(byte[] data)
विधि) के रूप में एक कुंजी स्वीकार करें
- एक पैरामीटर (
setIv(byte[] data)
विधि) के रूप में एक प्रारंभिक वेक्टर को स्वीकार करें
- इंटरनल स्टोर में फाइल के अंदर की को स्टोर करें
- आंतरिक स्टोर (
getId(byte[] data)
विधि) में एक फ़ाइल से कुंजी प्राप्त करें
- आंतरिक स्टोर में एक फ़ाइल से IV प्राप्त करें (
getIv(byte[] data)
विधि)
(लिस्टिंग 1. कीमैनगर मॉड्यूल KeyManager.java )
package com.yourapp.android.crypto;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.content.Context;
import android.util.Log;
public class KeyManager {
private static final String TAG = "KeyManager";
private static final String file1 = "id_value";
private static final String file2 = "iv_value";
private static Context ctx;
public KeyManager(Context cntx) {
ctx = cntx;
}
public void setId(byte[] data){
writer(data, file1);
}
public void setIv(byte[] data){
writer(data, file2);
}
public byte[] getId(){
return reader(file1);
}
public byte[] getIv(){
return reader(file2);
}
public byte[] reader(String file){
byte[] data = null;
try {
int bytesRead = 0;
FileInputStream fis = ctx.openFileInput(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
while ((bytesRead = fis.read(b)) != -1){
bos.write(b, 0, bytesRead);
}
data = bos.toByteArray();
} catch (FileNotFoundException e) {
Log.e(TAG, "File not found in getId()");
} catch (IOException e) {
Log.e(TAG, "IOException in setId(): " + e.getMessage());
}
return data;
}
public void writer(byte[] data, String file) {
try {
FileOutputStream fos = ctx.openFileOutput(file,
Context.MODE_PRIVATE);
fos.write(data);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
Log.e(TAG, "File not found in setId()");
} catch (IOException e) {
Log.e(TAG, "IOException in setId(): " + e.getMessage());
}
}
}
अगला, हम क्रिप्टो मॉड्यूल करते हैं ( सूची 2 देखें )। यह मॉड्यूल एन्क्रिप्शन और डिक्रिप्शन की देखभाल करता है। हमने बाइट सरणी डेटा को प्रिंट करने योग्य बेस 64 डेटा और इसके विपरीत में परिवर्तित करना आसान बनाने के लिए मॉड्यूल में एक armorEncrypt()
और armorDecrypt()
विधि जोड़ी है । हम सिफर ब्लॉक चेनिंग (CBC) एन्क्रिप्शन मोड और PKCS # 5 पैडिंग के साथ एईएस एल्गोरिथ्म का उपयोग करेंगे ।
(लिस्टिंग 2. क्रिप्टोग्राफिक मॉड्यूल Crypto.java )
package com.yourapp.android.crypto;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import android.content.Context;
import android.util.Base64;
public class Crypto {
private static final String engine = "AES";
private static final String crypto = "AES/CBC/PKCS5Padding";
private static Context ctx;
public Crypto(Context cntx) {
ctx = cntx;
}
public byte[] cipher(byte[] data, int mode) throws NoSuchAlgorithmException,NoSuchPaddingException,InvalidKeyException,IllegalBlockSizeException,BadPaddingException,InvalidAlgorithmParameterException {
KeyManager km = new KeyManager(ctx);
SecretKeySpec sks = new SecretKeySpec(km.getId(), engine);
IvParameterSpec iv = new IvParameterSpec(km.getIv());
Cipher c = Cipher.getInstance(crypto);
c.init(mode, sks, iv);
return c.doFinal(data);
}
public byte[] encrypt(byte[] data) throws InvalidKeyException,
NoSuchAlgorithmException, NoSuchPaddingException,
IllegalBlockSizeException, BadPaddingException,
InvalidAlgorithmParameterException {
return cipher(data, Cipher.ENCRYPT_MODE);
}
public byte[] decrypt(byte[] data) throws InvalidKeyException,
NoSuchAlgorithmException, NoSuchPaddingException,
IllegalBlockSizeException, BadPaddingException,
InvalidAlgorithmParameterException {
return cipher(data, Cipher.DECRYPT_MODE);
}
public String armorEncrypt(byte[] data) throws InvalidKeyException,NoSuchAlgorithmException,
NoSuchPaddingException,IllegalBlockSizeException,
BadPaddingException,InvalidAlgorithmParameterException {
return Base64.encodeToString(encrypt(data), Base64.DEFAULT);
}
public String armorDecrypt(String data) throws InvalidKeyException,NoSuchAlgorithmException,
NoSuchPaddingException,IllegalBlockSizeException,
BadPaddingException,InvalidAlgorithmParameterException {
return new String(decrypt(Base64.decode(data, Base64.DEFAULT)));
}
}
आप अपने किसी भी एप्लिकेशन में इन दो फाइलों को शामिल कर सकते हैं, जिन्हें एन्क्रिप्ट करने के लिए डेटा स्टोरेज की आवश्यकता होती है। सबसे पहले, सुनिश्चित करें कि आपके पास आपकी कुंजी और आरंभीकरण वेक्टर के लिए एक मूल्य है, फिर इसे संग्रहीत करने से पहले अपने डेटा पर एन्क्रिप्ट या डिक्रिप्ट विधियों में से किसी एक को कॉल करें। सूची 3 और सूची 4 में इन वर्गों का उपयोग करते हुए एक बस ऐप-उदाहरण है। हम 3 बटन एनक्रिप्ट, डिक्रिप्ट, डिलीट के साथ एक गतिविधि बनाते हैं; डेटा इनपुट के लिए 1 EditText; डेटा आउटपुट के लिए 1 टेक्स्ट व्यू।
(लिस्टिंग 3. एक उदाहरण। MainActivity.java )
package com.yourapp.android.crypto;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView encryptedDataView;
EditText editInputData;
private Context cntx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.cntx = getApplicationContext();
Button btnEncrypt = (Button) findViewById(R.id.buttonEncrypt);
Button btnDecrypt = (Button) findViewById(R.id.buttonDecrypt);
Button btnDelete = (Button) findViewById(R.id.buttonDelete);
editInputData = (EditText)findViewById(R.id.editInputData) ;
encryptedDataView = (TextView) findViewById(R.id.encryptView);
String key = "12345678909876543212345678909876";
String iv = "1234567890987654";
KeyManager km = new KeyManager(getApplicationContext());
km.setIv(iv.getBytes());
km.setId(key.getBytes());
btnEncrypt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String Data = editInputData.getText().toString();
String Encrypted_Data = "data";
try {
Crypto crypto = new Crypto(cntx);
Encrypted_Data = crypto.armorEncrypt(Data.getBytes());
} catch (InvalidKeyException e) {
Log.e("SE3", "Exception in StoreData: " + e.getMessage());
} catch (NoSuchAlgorithmException e) {
Log.e("SE3", "Exception in StoreData: " + e.getMessage());
} catch (NoSuchPaddingException e) {
Log.e("SE3", "Exception in StoreData: " + e.getMessage());
} catch (IllegalBlockSizeException e) {
Log.e("SE3", "Exception in StoreData: " + e.getMessage());
} catch (BadPaddingException e) {
Log.e("SE3", "Exception in StoreData: " + e.getMessage());
} catch (InvalidAlgorithmParameterException e) {
Log.e("SE3", "Exception in StoreData: " + e.getMessage());
}
encryptedDataView.setText(Encrypted_Data);
}
});
btnDecrypt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String Data = encryptedDataView.getText().toString();
String Decrypted_Data = "data";
try {
Crypto crypto = new Crypto(cntx);
Decrypted_Data = crypto.armorDecrypt(Data);
} catch (InvalidKeyException e) {
Log.e("SE3", "Exception in StoreData: " + e.getMessage());
} catch (NoSuchAlgorithmException e) {
Log.e("SE3", "Exception in StoreData: " + e.getMessage());
} catch (NoSuchPaddingException e) {
Log.e("SE3", "Exception in StoreData: " + e.getMessage());
} catch (IllegalBlockSizeException e) {
Log.e("SE3", "Exception in StoreData: " + e.getMessage());
} catch (BadPaddingException e) {
Log.e("SE3", "Exception in StoreData: " + e.getMessage());
} catch (InvalidAlgorithmParameterException e) {
Log.e("SE3", "Exception in StoreData: " + e.getMessage());
}
encryptedDataView.setText(Decrypted_Data);
}
});
btnDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
encryptedDataView.setText(" Deleted ");
}
});
}
}
(लिस्टिंग 4. एक उदाहरण। activity_main.xml)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<EditText
android:id="@+id/editInputData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:ems="10"
android:textColor="
<requestFocus />
</EditText>
<TextView
android:id="@+id/encryptView"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:layout_alignLeft="@+id/editInputData"
android:layout_alignRight="@+id/editInputData"
android:layout_below="@+id/buttonEncrypt"
android:layout_marginTop="26dp"
android:background="
android:text="Encrypted/Decrypted Data View"
android:textColor="
android:textColorHint="
android:textColorLink="
<Button
android:id="@+id/buttonEncrypt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/encryptView"
android:layout_alignRight="@+id/editInputData"
android:layout_below="@+id/editInputData"
android:layout_marginTop="26dp"
android:text="Encrypt" />
<Button
android:id="@+id/buttonDelete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/buttonDecrypt"
android:layout_alignRight="@+id/buttonDecrypt"
android:layout_below="@+id/buttonDecrypt"
android:layout_marginTop="15dp"
android:text="Delete" />
<Button
android:id="@+id/buttonDecrypt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/encryptView"
android:layout_alignRight="@+id/encryptView"
android:layout_below="@+id/encryptView"
android:layout_marginTop="21dp"
android:text="Decrypt" />
</RelativeLayout>