美文网首页
SQLCipher android 数据库加密

SQLCipher android 数据库加密

作者: 丸_子 | 来源:发表于2016-08-27 11:57 被阅读231次

    项目中引入了SQLCipher之后,会让你的程序体积骤然增加,打成APK后大概会变大好几M,是更侧重于文件大小,还是更侧重于程序安全,你应该根据具体的需求做出合适的判断。 manifest 配置写入文件权限 因为copy的数据库文件到创建的目录下

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

    module 下的build.gradle

    compile 'net.zetetic:android-database-sqlcipher:3.5.3@aar'
    

    application 或者你当前所用到的activity 首先要加上这句话

    SQLiteDatabase.loadLibs(this);
    

    创建一个MyDatabaseHelper

    public class MyDatabaseHelper extends SQLiteOpenHelper {       
        public static final String CREATE_TABLE = "create table Book(name text, pages integer)";    
        public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }      
        @Override      
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE);
        }      
        @Override     
        public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
        }
    }
    

    关键代码 activity

    public class MainActivity extends AppCompatActivity {  
      
        private SQLiteDatabase db;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
    //因为很多手机没有root 过 所以你没办法去找到你的db文件 并且copy出来查看 这时候需要手动去创建目录      
           createSdcardFolder();  
            setContentView(R.layout.main);  
            SQLiteDatabase.loadLibs(this);  
            MyDatabaseHelper dbHelper = new MyDatabaseHelper(this, "cipher.db", null, 1);  
            db = dbHelper.getWritableDatabase("secret_key");  
            Button addData = (Button) findViewById(R.id.add_data);  
            Button queryData = (Button) findViewById(R.id.query_data);  
            addData.setOnClickListener(new View.OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                    ContentValues values = new ContentValues();  
                    values.put("name", "达芬奇密码");  
                    values.put("pages", 566);  
                    db.insert("Book", null, values);  
                }  
            });  
            queryData.setOnClickListener(new View.OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                    Cursor cursor = db.query("Book", null, null, null, null, null, null);  
                    if (cursor != null) {  
                        while (cursor.moveToNext()) {  
                            String name = cursor.getString(cursor.getColumnIndex("name"));  
                            int pages = cursor.getInt(cursor.getColumnIndex("pages"));  
                            Log.d("TAG", "book name is " + name);  
                            Log.d("TAG", "book pages is " + pages);  
                        }  
                    }  
                    cursor.close();  
                }  
            });  
    //copy出数据库文件  
        copyfile.setOnClickListener(new View.OnClickListener() {  
                @Override  
                public void onClick(View view) {  
                    copyDatabaseToSdcard(MainActivity.this);  
                }  
            });  
        }  
      /** * 创建SdcardFolder    */  
        public void createSdcardFolder(){  
            if(SDCardUtils.isSDCardEnable()){  
                File file =null;  
                file = new File(String.format("%s%s",SDCardUtils.getSDCardPath(), "/cliper/temp"));  
                if(!file.exists()){//判断sdcard卡上是否有目录,没有目录则生成目录  
                    file.mkdirs();  
                }  
            }  
        }  
    /** * 复制数据库文件 */  
       public static void copyDatabaseToSdcard(Context context){  
            copyDatabaseToSdcard(context,"dbfile");  
        }  
    /** * 复制数据库文件 */  
    public static void copyDatabaseToSdcard(Context context,String name){  
            try {  
                File file = context.getDatabasePath("cipher.db");  
                FileUtil.writeFile(new FileInputStream(file.getAbsolutePath()), SDCardUtils.getSDCardPath()  
                        +"/cipher/temp" + "/"+name);  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }
    

    数据库加密之后 用工具无法打开。这就足以说明,目前数据库中的数据是非常安全的,只有在应用程序里通过SQLCipher提供的API才可以访问到数据库里的数据,使用其它的方式都无法获取其数据。


    1.jpeg

    创建目录

    /** 
       * 创建SdcardFolder 
       */  
      
         public void createSdcardFolder(){  
          if(SDCardUtils.isSDCardEnable()){  
              File file =null;  
              file = new File(String.format("%s%s",SDCardUtils.getSDCardPath(), "/cipher/temp"));  
              if(!file.exists()){  
                  file.mkdirs();  
              }  
          }  
      }
    

    SDCardUtils

    public static String getSDCardPath(){  
       return Environment.getExternalStorageDirectory().toString();  
      }
    

    FileUtil

    public final static void writeFile(InputStream input, String fileName) throws IOException {  
          writeFile(input, new FileOutputStream(fileName));  
      }  
    public final static void writeFile(InputStream input, OutputStream os) throws IOException  
    {    
         byte[] bs = new byte[1024];  // 设置数据缓冲    
          int len;   // 读取到的数据长度   
          while ((len = input.read(bs)) != -1) {     
         os.write(bs, 0, len);   }    
         os.close();    
         input.close();  
    }
    

    我自己经历的错误 : 1.你首先要确信 你的手机里 没有你现在建好的db 文件 否则它会告诉你不能加密此文件 :


    2.jpg

    2.我在as里 使用了 eclipse 配置的方法 却没有在build.gradle文件里做配置 eclipse的配置这些so 文件 jar包 zip 文件 都要有

    sourceSets {  
            main {  
                manifest.srcFile 'src/main/AndroidManifest.xml'  
                java.srcDirs = ['src/main/java']  
                res.srcDirs = ['src/main/res']  
                assets.srcDirs = ['assets']  
                jniLibs.srcDirs = ['libs']  
            }  
        }
    
    3.jpeg

    欢迎进群讨论,QQ群:104286694

    相关文章

      网友评论

          本文标题:SQLCipher android 数据库加密

          本文链接:https://www.haomeiwen.com/subject/yettettx.html