Android 各种加密方法解析

2,151 阅读5分钟
原文链接: www.cnblogs.com

编码.数字摘要.加密.解密

UrlEncoder /Urldecoder

 

?
1 2 3 4 5 6 7 8 9 String str = "http://www.baidu.com?serach = 哈哈";         String encode = URLEncoder.encode(str);         System.out.println("encode:" + encode);         //URLDecoder 操作         String decode = URLDecoder.decode(encode);         System.out.println("decode:" + decode);         //URLDecoder一个没有被Encode的数据,会原样打出         String decode2 = URLDecoder.decode(str);         System.out.println("decode:" + decode2);

 Base64:byte[]-->string

  • 上传图片,语音:
  • 存对象到sp:如map

 

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 iv = (ImageView) findViewById(R.id.iv);     findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {         @Override         public void onClick(View v) {             //1.bitmap             Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);             //2. bitmap-->byte[]             ByteArrayOutputStream baos = new ByteArrayOutputStream();             bitmap.compress(Bitmap.CompressFormat.PNG, 100 , baos);             byte[] byteArray = baos.toByteArray();             //3.byte[]->string,这样就可以用string传给服务器             String bitmapString = Base64.encodeToString(byteArray, Base64.DEFAULT);             System.out.println("bitmapString :" + bitmapString);             //4. string-->byte[];             byte[] bitmapByteArr = Base64.decode(bitmapString, Base64.DEFAULT);             //5.byte[]-->bitmap             Bitmap bitmap2 = BitmapFactory.decodeByteArray(bitmapByteArr, 0 , bitmapByteArr.length);             //6.在imageView上设置图片             iv.setImageBitmap(bitmap2);             //obj-->byte[] -->string->sp         }     });

  

  • md5,sha1:数字摘要算法(不是加密解密),1kb文件和一个1tb的文件md5之后长度是一样的,是单向的;
    • 作用:确定数据未被修改,确定数据的唯一性
    • 密码一般会md5,加盐
    • 秒传:长度变小了
    • android supoort v4:检验是否修改过

 


  • 加密:aes des

    • 对称加密:密码只有一个,加密速度比较快,只有一个密钥,可以加密文件之类;
    • 非对称加密:密钥有两个(公钥,私钥),私钥自己保存.公钥给别人.私钥自己留着;

      • 公钥加密-->私钥解密

        public static byte[] encryptByPublicKey(byte[] data, String publicKey)//公钥加密
        public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey)//私钥解密
        
      • 私钥加密-->公钥解密

        public static byte[] encryptByPrivateKey(byte[] data, String privateKey);//私钥加密
        public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey)//公钥解密
        
      • 私钥签名-->公钥验证-->数字签名

        public static String sign(byte[] data, String privateKey);//私钥签名
        public static boolean verify(byte[] data, String publicKey, String sign)//公钥验证
        
  • 数字签名作用:来源的不可否认性
  • 公钥互换:相互置换公钥

sqlite加密,使用sqlcipher:把lib、assets目录的东西拷进去,但是内存会增加4-5m,需要对数据库加密的时候可以考虑用

MySqliteOpenHelper ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class MySqliteOpenHelper extends SQLiteOpenHelper {     private static String name = "my.db" ;     private static int version = 1;     public MySqliteOpenHelper(Context context) {         super(context, name, null , version);     }     @Override     public void onCreate(SQLiteDatabase db) {         db.execSQL("create TABLE t_test(name TEXT,age INTEGER)" );     }     @Override     public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {         // TODO     } }

  

MainActivity

?
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 public class MainActivity extends Activity {     private MySqliteOpenHelper helper;     private String password = "xxxxoooo";     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         SQLiteDatabase.loadLibs(this);//初始化sqlcipher         helper = new MySqliteOpenHelper(this );     }     public void insert(View v) { //多了个password         SQLiteDatabase db = helper.getWritableDatabase(password);         ContentValues values = new ContentValues();         values.put("name", "billy" );         values.put("age", 100 );         db.insert("t_test", null , values);     }     public void query(View v) {         SQLiteDatabase db = helper.getReadableDatabase(password);         Cursor c = db.query("t_test", null , null, null, null, null, null);         while (c.moveToNext()) {             String name = c.getString(0);             int age = c.getInt(1);             System.out.println("name:" + name + "age:" + age);         }     } }

 

IMEI-->有别于sim卡的序列号

可以作为手机的唯一标识,类似我们pc的机器码;

  • 两个概念
    • imei:设备的唯一标识;
    • imsi:移动sim卡的唯一标识;
  • 买手机:3码合一 手机序列号 电池序列号 手机包装序列号
  • 统计apk的安装量
    • 启动应用程序的时候.把手机的imei号上传到服务器;
  • 获取

    TelephonyManager telephonyManager = (TelephonyManager) ctx .getSystemService(Context.TELEPHONY_SERVICE); telephonyManager.getDeviceId()

3层加密-->只是加大了被破解的难度

  • des-->密码唯一化,复杂化(但是还是不安全)

    this.PASSWORD = "com.sina.vdisk.security.password.d7af3082d815945ff47ae58647bd9436" + IMEI + appKeyPair.key + appKeyPair.secret;

  • 秘钥放到so库里面.通过jni调用-->密码放到so库里面.这个时候.加到了获取秘钥的难度.(同样,反编译apk,可以拿到so库,然后可以调用本地方法获取到密码)

  • 混淆(也是可以拿到,混淆的时候.我们的字符串是不会进行混淆的.只是混淆我们方法名,以及变量名)

apk如何防止被反编译

    • 梆梆加固
    • 爱加密