1、基本算法
消息摘要(Message Digest):简称摘要,在消息数据上执行一个单向的Hash函数,生成一个固定长度的Hash值,也称为数字指纹,消息摘要有以下特点:通过摘要无法推算得出消息本身;如果修改了消息,那么摘要一定会变化(除开碰撞情况);消息摘要只能保证消息的完整性,并不能保证消息的不可改动性,在Android证书里,一般采用SHA-1算法来生成摘要值。
数字签名(Signature):消息的发送者用自己的私钥对消息摘要进行加密,产生一个加密后的字符串,称为数字签名,因为发送者的私钥保密,可以确保别人无法伪造生成数字签名,也是对信息的发送者发送信息真实性的一个有效证明,数字签名是 非对称密钥加密技术 + 数字摘要技术 的结合。
数字证书(Certificate):数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件,证书包含的有效信息有:证书版本、证书序号、证书颁发机构、证书有效期、证书拥有者和拥有者公钥,以及证书颁发机构对该证书的签名,需要注意的是Android APK中的CERT.RSA证书可以是自签名的,并不需要这个证书是第三方权威机构发布或者认证的,用户可以在本地机器自行生成这个自签名证书。
2、Android证书组成
MANIFEST.MF:遍历APK包中除了META-INF 文件夹以外的所有文件,利用SHA1算法生成这些文件的消息摘要,然后转化为对应的base64编码,MANIFEST.MF存储的是文件的摘要值,保证完整性,防止文件被改动。
.SF:xx.SF文件(xx为使用者证书的自定义别名,默认为CERT,即CERT.SF),保存的是MANIFEST.MF的摘要值, 以及MANIFEST.MF中每一个摘要项的摘要值,然后转化成对应的base64编码,虽然该文件的后缀名.sf(SignatureFile)看起来是签名文件,但是并没有私钥参与运算,也不保存任何签名内容。
.RSA / .DSA:.RSA / .DSA文件(后缀不同采用的签名算法不同,.RSA使用的是RSA算法, .DSA使用的是数字签名算法DSA,目前APK主要使用的是这两种算法),保存的是第二项.SF文件的数字签名,同时还会包括签名采用的数字证书(公钥),特别说明,当使用多重证书签名时,每一个.sf文件必须有一个.RSA/.DSA文件与之对应。
1、SSL劫持攻击
破绽描述:许多Android APP虽然使用了https通信方式,但只是简单地调用,并未对SSL证书有效性做验证,这使得攻击者可以利用中间人攻击(MITM)手段,轻易获取手机用户的明文通信信息。
影响:用户的隐私和数据安全受到严重威胁,攻击者可以窃取敏感信息,如登录凭证、银行卡信息等。
2、证书验证逻辑缺陷
破绽描述:部分APP在验证证书时,存在逻辑上的缺陷,如未正确校验证书的颁发机构、有效期等关键信息。
影响:可能导致APP信任了不合法的证书,从而与反面服务器建立连接,泄露用户数据。
3、自签名证书误用
破绽描述:开发者在开发过程中,为了方便测试,可能会使用自签名证书,但在生产环境中忘记替换为正式证书,导致APP在生产环境中仍然信任自签名证书。
影响:降低了APP的安全性,使得攻击者更容易利用自签名证书进行中间人攻击。
1、如何检测Android应用是否存在证书验证破绽?
解答:可以通过静态代码分析工具和动态测试工具来检测,静态代码分析工具可以扫描应用的源代码,查找潜在的证书验证逻辑缺陷,动态测试工具则可以在应用运行时模拟各种网络环境,检测应用是否容易受到中间人攻击等。
2、如何修复Android应用中的证书验证破绽?
解答:开发者应该更新应用的证书验证逻辑,确保正确校验证书的所有关键信息,应该避免在生产环境中使用自签名证书,而是使用由受信任的证书颁发机构颁发的正式证书,还应该定期对应用进行安全审计和破绽扫描,及时发现并修复潜在的安全问题。