1.Android 安全的概念
- 1.1.应用和数据处理安全问题
- 1.2.保护应用数据和服务不被其他应用访问,
- 1.3.唯一用户ID,唯一的密钥签名
- 1.4.只有当其他应用在它们的AndroidManifest.xml文件中显式声明了、正确权限后,Android的权限系统才会允许
- 1.5.应用也可以定义权限
2.签名和密钥
- 2.1.过程:
1)通过Gradle构建系统自动生成的调试密钥来对应用进行签名
2)在Google Play Store上发布应用时,由keytool工具生成的唯一密钥
3)多个应用共享同一个密钥通常是因为这些应用要直接访问彼此的数据
4)设定权限时将保护等级设为了signature。
5)如果丢失密钥库文件或是忘记了密码,就无法再对应用的新版本进行签名了,也就无法再为用户提供应用的版本升级了。 - 2.2.步骤:
1)为应用生成一个新的、唯一的密钥
2)将应用的包名作为别名传给-alias
3)如果为多个团队维护应用密钥,建议将各个团队的密钥存储到单独的密钥库(keystore)
4)对各个密钥库使用不同的密码。
**5)**keytool -genkey -v -keystore \ -alias -keyalg RSA -keysize 2048 -validity 10000
- 2.1.过程:
3.Android权限
- 3.1.使用特色功能:
1)在AndroidManifest.xml文件中加入一个uses-permission标记即可,它会告诉系统你的应用需要该项特殊权限,并在安装时通知用户这项需求。 - 3.2.保护等级:
1)常规(normal):默认等级一般是常规,用来告知系统有应用要用到这个权限的函数
2)危险(dangerous):只有将权限设为危险时,它才会在用户安装前提醒用户。
3)同一签名(signature):要求应用使用跟定义该权限的应用相同的同一证书来签名,对设备制造商来说非常有用,因为他们可以定义只有跟系统使用同一证书签名的应用才能使用的权限,设备制造商就可以向他们使用受保护的系统服务的设备发布新应用了。
4)同一签名(signature)应用必须驻存在设备的系统分区上,这样才能使用该权限。预装在系统分区上的Google应用(Gmail、GooglePlay服务、YouTube等)。这些应用可以使用许多常规应用无法企及的权限。
5)系统(system) - 3,3,声明定制权限
1)使用场景:如果要为其他应用提供一些API(如插件功能)的话,建议你定义自己的权限
- 3.1.使用特色功能:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.aaptl.security"
android:versionCode="1"
android:versionName="1.0" >
<permission android:name="com.aaptl.security.READ_DATA"
android:description="@string/read_perm_desc"
android:label="@string/read_perm_label"
android:protectionLevel="dangerous" />
<permission android:name="com.aptl.security.WRITE_DATA"
android:descriptiona="@string/write_perm_desc"
android:label="@string/write_perm_label"
android:protectionLevel="signature" />
...
<provider
android:name=".TaskProvider"
android:authorities="com.aaptl.security.provider"
android:readPermission="com.aaptl.security.READ_DATA"
android:writePermission="com.aaptl.security.WRITE_DATA"
android:exported="true"/>
...
</manifest>
//为ContentProvider声明读和写权限,读权限的保护等级被设置为危险,它会在用户安装使用此权限的应用时弹出提醒窗口,写权限的保护等级被设为同一签名,它会将此权限的使用限制到使用同一证书签名的应用范围内,android:permissionFlags=”costsMoney”它会告诉用户使用此权限的应用会产生费用
- 4.保护用户数据
- 4.1.无法访问的内容:将其存储到应用的默认数据目录中,只能由该应用或是拥有同一用户ID的应用(这就要求该应用是用同一证书签名的)访问。
典型场景:wight
包括:文件file/数据库db/设置项sharedPreference/缓存cache - 4.2.外部存储:内容做了加密处理,
- 4.3.敏感信息:加密处理
- 4.4.如何向一个私有文件追加数据?
java
public static void appendStringToPrivateFile(Context context,
String data, String filename) {//应用自身的数据目录就是一个服务器,存放数据的中心,写数据out
FileOutputStream outputStream
= context.openFileOutput(filename,
Context.MODE_APPEND|Context.MODE_PRIVATE);
//Context.openFileInput() 方法来打开文件读取数据
//Context.openFileOutput() 方法来打开文件写数据
//Context.MODE_APPEND和Context.MODE_PRIVATE,做openFileOutput()的标志//位:要写入的数据都被追加到文件末尾,该文件只允许你的应用访问
//默认标志位:Context.MODE_PRIVATE 私有,防止其他应用访问
outputStream.write(data.getBytes("UTF-8"));
outputStream.close();
}
- 4.1.无法访问的内容:将其存储到应用的默认数据目录中,只能由该应用或是拥有同一用户ID的应用(这就要求该应用是用同一证书签名的)访问。
5.验证调用应用 【没有看懂】
- 5.1.应用场景:将来自不同数据源的数据聚合的应用以及用到第三方开发人员提供的插件的应用。
6.客户端数据加密
- 6.1.应用原因:
1)即使服务器端被攻破,用户的数据依然可以受到保护
2)加密和解密必须都在客户端完成,基于Java SE的javax.crypto包中的API开发的 - 6.2.数据加密和解密AP:
1)基于Java SE的javax.crypto包中的API开发的
2)如何利用AES算法生成一个SecretKey秘钥?
- 6.1.应用原因:
//据参数也就是用户输入生成安全且唯一的密钥,加密函数
//盐(salt)是用做加密算法中单向函数输入的一段随机数据。
public static SecretKey generateKey(char[] password, byte[] salt)
throws Exception {
int iterations = 1000;
int outputKeyLength = 256;
SecretKeyFactory secretKeyFactory
= SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec keySpec = new PBEKeySpec(password, salt,
iterations, outputKeyLength);
byte[] keyBytes = secretKeyFactory.generateSecret(keySpec).getEncoded();
return new SecretKeySpec(keyBytes, "AES");
}
- 7.为你的Android App实现自签名的 SSL 证书
http://www.open-open.com/lib/view/open1413071600531.html