zoukankan      html  css  js  c++  java
  • Android加密解析

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

    UrlEncoder /Urldecoder

    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

     

    	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
    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

    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如何防止被反编译

      • 梆梆加固
      • 爱加密
  • 相关阅读:
    leetcode:655. 输出二叉树
    leetcode:763. 划分字母区间
    leetcode:3. 无重复字符的最长子串
    leetcode:2. 两数相加
    leetcode每日一题:409. 最长回文串
    leetcode:1381. 设计一个支持增量操作的栈
    leetcode:1380. 矩阵中的幸运数
    [数据结构] 迷宫问题(栈和队列,深搜和广搜)
    [数据结构] N皇后问题
    [2011山东ACM省赛] Sequence (动态规划)
  • 原文地址:https://www.cnblogs.com/sixrain/p/5313420.html
Copyright © 2011-2022 走看看