Articles of 安全

如何使用X509TrustManagervalidationandroid.net.http.SslCertificate?

Android的WebViewClient在遇到不受信任的证书时会调用onReceivedSslError 。 但是,我在该调用中收到的SslError对象没有任何公共方式来获取底层X509Certificate以对现有的TrustStoreManager进行validation。 查看源代码,我可以这样访问X509Certificate的编码字节: public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { Bundle bundle = SslCertificate.saveState(error.getCertificate()); X509Certificate x509Certificate; byte[] bytes = bundle.getByteArray(“x509-certificate”); if (bytes == null) { x509Certificate = null; } else { try { CertificateFactory certFactory = CertificateFactory.getInstance(“X.509”); Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes)); x509Certificate = (X509Certificate) cert; } catch (CertificateException e) { x509Certificate […]

谷歌云消息安全

公司创建项目并接收发件人ID。 公司创建一个应用程序,烘焙其发件人ID并将应用程序放在商店中。 攻击者对应用程序进行反向工程,并提取发件人ID和用于接收GCM注册ID的服务器接口。 攻击者创建自己的应用程序,烘焙公司的发件人ID和服务器注册界面,将应用程序放入商店。 就GCM而言,攻击应用程序基本上冒充公司的真实应用程序:它注册接收来自公司发件人ID的邮件,然后将其GCM注册ID发送到公司的服务器,就像“真正的”应用程序一样。 现在,公司希望向其应用的所有实例广播一些信息。 也许这是一个提醒,而不是更新可用。 有没有办法区分“攻击应用程序”(注册就像真正的应用程序)与公司应用程序的“真实”版本?

如何在跨应用程序发送Intent数据时保护它们

我正在研究我的android应用程序的安全方面。 我想知道在将一个应用程序从一个应用程序发送到另一个应用程序时保护Intent数据和附加内容的方法,这样除了这两个应用程序之外没有其他应用程序可以窥探它。 其中一种蛮力方法是使用android的加密 – 解密来编码意图数据,有没有更好的方法来实现相同的? 提前致谢。

如何在模拟器中将CA证书导入Android 4.4.2?

我尝试了DER和PEM格式。 我尝试使用文件扩展名crt,cer,p12,pem但没有导入它们。 我进入设置>安全>从SD卡安装,它将我带到下载页面。 我列出了证书,但是当我点击它们时,没有任何反应。 更新添加:我最终回到4.3。 它工作得很好。

在应用计费安全性

我已经完成了在app billing v3中使用的应用程序的开发。 我的应用程序是一个考试帮助应用程序,其中包含一系列插入数据库的问题。 令我担心的是安全性超越预期,其他几乎没有。 我的应用程序查询库存中的已购买商品,因此存储购买不是问题。 所以第一个问题是有人可以反编译应用程序(我已经完成了),即使使用proguard,你也可以毫不费力地检索所有问题。 接下来是应用程序的公钥。 这可以很容易地从我的应用程序中获取,根据开发人员指南,这是我应该保持安全的。 但是我真的不知道如何实现任何forms的安全性。 或者甚至我应该走多远才能获得安全保障。 没有服务器,如果我将所有东西都保存在设备上,我认识到它不会是完美的(远非它),但我至少会喜欢黑客而不是被逗乐。 所以基本上问题是: 我应该使用什么types的安全性以及如何使用它? 只是指着我一步一步地浏览它的链接,这样我就能理解它会很棒。 非常感谢你! 澄清: 没有涉及服务器。 数据存储在应用程序中。 当查询库存时(通过queryinventoryasync方法),如果已购买库存,则返回库存,并且每次应用程序启动时都会运行。 在应用程序计费本身,我认为是可以的,我要求更多关于我自己的应用程序的应用程序公钥 – 我的意思是以某种方式使复制更难,但目前我已经把它分成15个字符串,我只是“添加”它们在运行时彼此相关,但这几乎没有任何好处,只需将它作为一个字符串。 我想以某种方式加密它只是不知道如何。

Android权限:我怎样才能了解哪些危险与正常相比?

Android定义了第三方应用可以请求的一组权限。 权限按敏感度分类; 大多数权限都是“正常”或“危险” 。 在不提示用户的情况下自动授予正常权限; 安装应用程序并要求用户同意授予用户时,会向用户显示危险权限。 问题:对于我想到的任何特定Android权限,我如何判断它是正常权限还是危险权限? 是否有危险权限列表和正常权限列表? (我知道第三方应用程序可以声明自己的权限。我只询问标准权限。我知道可能无法获得100%完整的列表。我只是在寻求最大努力;某些东西总比没有好。) 对于相关但不同的问题,请参阅我在哪里可以获得Android权限列表 (但是,这是一个不同的问题;它不是正常与危险的区别,我不一定需要完整的列表)。

SecurityException:不允许执行OP_READ_PHONE_STATE

用户使用此错误跟踪报告我的应用程序崩溃 java.lang.SecurityException: com.android.phone from uid 10134 not allowed to perform OP_READ_PHONE_STATE at android.os.Parcel.readException(Parcel.java:1620) at android.os.Parcel.readException(Parcel.java:1573) at com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy.getVoiceMailNumberForSubscriber(IPhoneSubInfo.java:858) at android.telephony.TelephonyManager.getVoiceMailNumber(TelephonyManager.java:2383) at android.telephony.TelephonyManager.getVoiceMailNumber(TelephonyManager.java:2366) 到目前为止,只有一个用户报告了此问题。 数千名其他用户正在运行此版本的应用程序,没有明显的问题。 当我们调用TelephonyManager.getVoiceMailNumber()时抛出exception。 此操作记录为READ_PHONE_STATE权限,该权限已被绝对正式授予。 我跟踪了android.apps.AppOpsManager类的OP_READ_PHONE_STATE权限,但无法确切地知道它不满意的内容。 任何人都可以解释发生了什么以及需要做些什么来解决问题。 谢谢,-Ken

我应该如何编码来抵制“一键盗版”?

我正在处理的应用程序被antiLVL自动破解(虽然我在我的应用程序中没有使用LVL)。 为了保护我的应用免受“一键盗版”的影响,我正在实施Google IO中解释的篡改检测技术 。 我尝试使用getPackageInfo()和reflection( invoke() )检查签名,但AntiLVL能够在两种情况下自动破解应用程序。 如何编写当前版本的antiLVL(1.4.0)不会自动破解的代码? 我的意思是,除了使用JNI。 PS:我不是在谈论防止盗版。 我只是希望盗版者手工挖掘代码,而不是使用自动破解器。

使用软件/硬件支持的Android Keystore以及可能的安全性/可用性缺陷

我目前正在研究在Android应用程序中存储/使用机密密钥的可能性。 我发现Nikolay Elenkov的博客对这个主题很有帮助,我学到了很多关于Android密钥库和一些基于硬件的实现的东西。 我仍然对安全性和用户体验方面有一些疑问。 软件密钥库 根据我的理解,在此配置中,从用户密码(加上盐以防止彩虹表攻击)导出(使用PBKDF2)主密钥,并用于加密机密。 据我所知,密码是用于锁定屏幕的密码。 在非root用户手机上,只有用户’keystore’能够读/写加密文件,每当应用程序想要访问文件时,都必须调用keystore守护进程,该守护进程检查其UID是否有权访问该文件(授权存储在sqlite数据库中)。 但仍有一些我无法弄清楚的细节: 使用密钥库是否强制使用受密码保护的锁定屏幕? 每次需要访问加密密钥时,用户是否必须输入他/她的密码? 鉴于它是一种纯软件机制,我认为只要密钥操作用于加密操作,密钥总是会在RAM中解密,对吧? 基于硬件的密钥库 至于基于硬件的实现,SoC制造商似乎提供符合[Global Platform TEE][2] (可信执行环境)的解决方案,其中包含嵌入式可信应用程序和API,使Google能够提供其密钥库的硬件支持实现。 因此,可以在TEE中存储密钥,在TEE内部请求创建RSA密钥对,并使用存储在TEE内的密钥来签名或检查数据。 这样,人们就可以使用密钥进行基本的加密操作,而无需离开TEE。 如果我做对了,那么Google密钥库守护程序使用与软件实现中相同的机制来提供对这些密钥的访问控制。 唯一的区别是使用了对存储在TEE中的密钥的引用而不是加密密钥本身。 如果之前说明的所有内容都是正确的,我想在root用户手机上可以修改权限数据库,以便具有任意UID的应用程序可以使用存储在TEE中的任何密钥签名数据。 我对吗 ? 谢谢你的时间!

我们应该使用谷歌的安全提供商与OkHttp?

我们在Android项目中使用okhttp与我们的API交谈; 所有通信都使用SSL / TLS加密,我们的服务器可以说SPDY。 我们还在Google Play服务中为融合位置提供商和其他一些function进行链接。 我们目前没有使用的Play服务的一部分是他们的安全提供商 ,它承诺升级设备的SSL堆栈以某种方式防止各种漏洞。 但是,文档对于提供程序实际执行的操作以及SSL方法受其影响的内容有些模糊,哪些不是(提供了一些示例,但不是全面的列表)。 所以,我想我的问题是双重的: 动态安全提供程序是否可以使用okhttp,或者okhttp是否依赖于不受安装提供程序影响的较低级别(或更高级别)的API? 假设它确实有效,有什么好处? 是否值得关注安全方面的好处? 它实际上是否会修复okhttp 2.2中与ALPN相关的本机崩溃,正如nfuller暗示的那样 ?