标签: android-security

在实施onReceivedSslError时,Webview会避免谷歌播放的安全警报

我有一个链接将在webview中打开.问题是它不能打开,直到我覆盖onReceivedSslError,如下所示:

 @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            handler.proceed();
        }
Run Code Online (Sandbox Code Playgroud)

我从谷歌游戏获得安全警报说:

安全警报您的应用程序具有WebViewClient.onReceivedSslError处理程序的不安全实现.具体来说,该实现忽略了所有SSL证书验证错误,使您的应用程序容易受到中间人攻击.攻击者可以使用JavaScript更改受影响的WebView内容,读取传输的数据(例如登录凭据),以及在应用程序内部执行代码.

要正确处理SSL证书验证,只要服务器提供的证书符合您的期望,就更改代码以调用SslErrorHandler.proceed(),否则调用SslErrorHandler.cancel().包含受影响的应用和类别的电子邮件警报已发送到您的开发者帐户地址.

请尽快解决此漏洞并增加已升级APK的版本号.有关SSL错误处理程序的更多信息,请参阅开发人员帮助中心中的文档.对于其他技术问题,您可以发布到https://www.stackoverflow.com/questions并使用标签"android-security"和"SslErrorHandler."如果您使用的是负责此操作的第三方库,请通知第三方并与他们合作解决问题.

要确认您已正确升级,请将更新后的版本上传到开发者控制台,并在五小时后再回来查看.如果应用尚未正确升级,我们将显示警告.

请注意,虽然这些特定问题可能不会影响使用WebView SSL的每个应用程序,但最好保持所有安全补丁的最新状态.如果应用程序存在漏洞,使用户面临泄密风险,则可能会被视为违反内容政策和开发者分发协议第4.4节的危险产品.

请确保发布的所有应用均符合开发者分发协议和内容政策.如果您有任何疑问或疑虑,请通过Google Play开发者帮助中心与我们的支持小组联系.

如果我删除onReceivedSslError (handler.proceed()),则页面将无法打开.

无论如何我可以在webview中打开页面并避免安全警报.

android android-webview google-play android-security sslerrorhandler

58
推荐指数
6
解决办法
4万
查看次数

检索私钥时,链为空

我正在使用我存储在Android密钥库中的RSA密钥对加密我的应用程序中的数据.

我一直NullPointerException在Play商店看到s,但我无法重现它们:

java.lang.NullPointerException: chain == null
    at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:1205)
    at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:374)
    at java.security.KeyStore.getEntry(KeyStore.java:644)
    at MyClass.getKeyStoreEntry(MyClass.java:111)
Run Code Online (Sandbox Code Playgroud)

创建密钥对的源代码

Calendar start = Calendar.getInstance();
start.setTimeInMillis(0);
Calendar end = Calendar.getInstance();
end.set(Calendar.YEAR, 3000);

KeyPairGeneratorSpec.Builder keySpecBuilder = new KeyPairGeneratorSpec.Builder(context)
    .setAlias(keyName)
    .setSubject(new X500Principal("CN=" + keyName))
    .setSerialNumber(BigInteger.TEN)
    .setStartDate(start.getTime())
    .setEndDate(end.getTime())
    .setKeySize(RSA_KEY_SIZE);

KeyPairGeneratorSpec spec = keySpecBuilder.build();
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
gen.initialize(spec);
gen.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)

然后检索密钥:

private KeyStore.PrivateKeyEntry getKeyStoreEntry() {
    KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
    keyStore.load(null);

    if (!keyStore.containsAlias(keyName)) {
        throw new KeyNotFoundException();
    }
    return (KeyStore.PrivateKeyEntry) keyStore.getEntry(keyName, null);
}
Run Code Online (Sandbox Code Playgroud)

只有当我使用KeyPairGeneratorSpecon API级别19-22 时才会发生这种情况.23+实现工作正常. …

android android-keystore private-key android-security

34
推荐指数
1
解决办法
1879
查看次数

在我的手机上运行的网络安全策略不允许 CLEARTEXT 通信

我正在构建一个应用程序,并且在我朋友的手机上面临网络安全策略错误不允许的 CLEARTEXT 通信(我只是在另一个手机上测试它)。当然我无法追踪问题,因为应用程序在我的手机上运行正常(没有 USB 调试),我从谷歌播放下载它。

我通过添加android:usesCleartextTraffic="true"到应用程序标签来解决这个问题, AndroidManifest.xml 我还添加了 android:networkSecurityConfig="@xml/network_security_config"

我的配置 XML:

<?xml version="1.0" encoding="utf-8"?>
  <network-security-config>
      <domain-config cleartextTrafficPermitted="true">
      <domain includeSubdomains="true">MY IP</domain>
  </domain-config>
</network-security-config>
Run Code Online (Sandbox Code Playgroud)

它仍然无法正常工作。我无法在我的手机上追踪问题,因为它可以工作。为什么我没有收到和我朋友手机一样的错误???

我希望它在我的手机上给我同样的错误,以便能够追踪问题。我删除了上述所有选项,但它仍然可以在我的手机上运行。在我添加任何东西之前它甚至可以工作,因为我只是在我朋友的手机上安装后才发现问题。

android http android-security cleartext

26
推荐指数
2
解决办法
3万
查看次数

针对不安全的TrustManager的Google Play安全警报

在我的一个应用程序中,我使用带有自签名证书的HTTPS,并按照Android开发人员培训网站(https://developer.android.com/training/articles/security-ssl.html#UnknownCa)中的示例代码进行操作.

我最近得到了以下警报,说当前的实施不安全:

安全警报

您的应用程序正在使用与Apache HTTP客户端的X509TrustManager接口的不安全实现,从而导致安全漏洞.有关详细信息,请参阅此Google帮助中心文章,其中包括修复漏洞的截止日期.

有人可以提供更多详细信息,除了上面链接的示例代码之外应该更新什么?

我应该实现自定义TrustManager吗?如果是这样,它应该验证什么?

security ssl android android-security trustmanager

22
推荐指数
2
解决办法
9271
查看次数

如何防止泄露密钥库和密码的使用?

问题

密钥库及其密码用于签署应用程序,然后由Android用于识别开发人员.如果泄露,有人可以代表我们更新相关的应用程序.即使该人无法访问我们的Playstore帐户,他们仍然可以将其发布到其他地方.

我们到处都看到,"永远不会失去它","永不泄漏它",等等.但是,如果我这样做了呢?当他们(密钥库和密码)泄漏时我无法找到所需的步骤,因此我可以保护我们的用户和我们的应用程序.

即使我与其他appid发布相同的应用程序,我如何保护仍旧旧用户?这里有一些最好的做法吗?

android android-keystore android-security

21
推荐指数
1
解决办法
658
查看次数

如何在Android应用中修复X509TrustManager的不安全实现

谷歌已经建议我在我的Android应用程序中有一个不安全的接口X509TrustManager实现,需要更改我的代码如下:

要正确处理SSL证书验证,请在自定义X509TrustManager接口的checkServerTrusted方法中更改代码,以便在服务器提供的证书不符合您的期望时引发CertificateException或IllegalArgumentException.对于技术问题,您可以发布到Stack Overflow并使用标签"android-security"和"TrustManager".

如何修改以下代码以解决上述问题?

public EasySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
    super(truststore);

    TrustManager tm = new X509TrustManager()  {
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }

        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    };

    mContext.init(null, new TrustManager[] { tm }, null);
}
Run Code Online (Sandbox Code Playgroud)

android-security trustmanager

20
推荐指数
1
解决办法
2万
查看次数

以编程方式接受Nougat中的呼叫

从一年开始,我一直在研究物联网产品,所附的应用程序工作正常.现在我无法在更高版本的android中以编程方式接受调用.功能对产品非常重要.任何帮助都非常感谢.

2016年11月安全补丁更新之前,Runtime.getRunTime.exec("Command")以编程方式接受呼叫工作正常.

Runtime.getRuntime().exec("input keyevent " +Integer.toString(KeyEvent.KEYCODE_HEADSETHOOK));
Run Code Online (Sandbox Code Playgroud)

如何在Nougat版本的android中实现它.

寻找任何类型的黑客.

我已经为增强功能打开了一个帖子.

https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Status%20Priority%20Owner%20Summary%20Stars%20Reporter%20Opened&groupby=&sort=&id=231938

注意*如果您中的任何一方遇到同样的问题,请请求加入Android Dev Team并提供用户获得运行时许可的条款.按照上面提到的URL来请求.

android android-security android-7.0-nougat android-7.1-nougat

19
推荐指数
2
解决办法
5224
查看次数

Google Play警告错误实施Google Play inApp结算

我刚从Google Play收到以下电子邮件

'你好Google Play开发者,

我们检测到您在此电子邮件末尾列出的应用程序正在调用应用内结算服务,而无需为目标设置目标包.这可以使恶意程序包绕过Play商店计费系统并访问尚未购买的项目.

下一步

如果您使用的是IabHelper,请开始使用最新的SDK.如果您手动调用应用内结算服务,请确保在"com.android.vending.billing.InAppBillingService.BIND"的任何意图上调用Intent.setPackage("com.android.vending").登录您的开发者控制台并提交应用的更新版本.五小时后再回来 - 如果应用程序没有正确更新,我们会显示一条警告消息.

我不确定这个问题的解决方法是什么.任何人都可以告诉在哪里指定代码?它是Java类或Manifest中的某个地方吗?

android google-play android-security

18
推荐指数
1
解决办法
4732
查看次数

如何在android中安全地保存Oauth Access令牌

在身份验证之后,我可以从服务器访问令牌,"uyhjjfjfgg567f8fhjkkf"现在我想将其安全地保存在设备中.我查看了android开发者网站中的Keystore和Keychain.我不清楚它是如何工作的以及我们应该如何从密钥库中检索令牌.

KeyPairGenerator kpg = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder(
        alias,
        KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
        .setDigests(KeyProperties.DIGEST_SHA256,
            KeyProperties.DIGEST_SHA512)
        .build());

KeyPair kp = kpg.generateKeyPair();


/*
 * Load the Android KeyStore instance using the the
 * "AndroidKeyStore" provider to list out what entries are
 * currently stored.
 */

KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
Enumeration<String> aliases = ks.aliases();
Run Code Online (Sandbox Code Playgroud)

android oauth access-token android-security

18
推荐指数
2
解决办法
9142
查看次数

UnrecoverableKeyException无法获取有关私钥的信息,KeyStoreException:无效的密钥blob

在我们的应用程序中,我们一直遇到Android Keystore中的数据突然变得无法访问的问题.我们看到的具体例外情况如下:

java.security.UnrecoverableKeyException: Failed to obtain information about private key
 at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:223)
 at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(AndroidKeyStoreProvider.java:259)
 at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePrivateKeyFromKeystore(AndroidKeyStoreProvider.java:269)
 at android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:94)
 at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:474)
 at java.security.KeyStore.getEntry(KeyStore.java:1560)
 at <PACKAGE_NAME>.EncryptionInteractor.generateKeys(EncryptionInteractor.java:104)
 at <PACKAGE_NAME>.EncryptionInteractor.generateKeys(EncryptionInteractor.java:100)
 at <PACKAGE_NAME>.EncryptionInteractor.init(EncryptionInteractor.java:93)
 at <PACKAGE_NAME>.EncryptionInteractor.<init>(EncryptionInteractor.java:80)
 at <PACKAGE_NAME>.EncryptionInteractor.init(EncryptionInteractor.java:65)
 at <PACKAGE_NAME>.<APPLICATION_CLASS>.onCreate(APPLICATION_CLASS.java:17)
 at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1118)
 at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5791)
 at android.app.ActivityThread.-wrap1(Unknown Source:0)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
 at android.os.Handler.dispatchMessage(Handler.java:105)
 at android.os.Looper.loop(Looper.java:164)
 at android.app.ActivityThread.main(ActivityThread.java:6541)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: android.security.KeyStoreException: Invalid key blob
 at android.security.KeyStore.getKeyStoreException(KeyStore.java:695)
 at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:224)
  ... 21 more
Run Code Online (Sandbox Code Playgroud)

我们无法想出一种可靠的方法来重现这个问题.有几篇文章提到了可能导致密钥库"忘记"密钥或被锁定的状态,例如此处.但是,据我所知,我们没有陷入任何这些边缘情况.在首次设置密钥后让设备静置一段时间后,似乎会发生这种情况.我们已经看到这种情况发生在多个仿真器和设备上,范围从21到26.此外,这些设备使用了滑动解锁或PIN.更改PIN或安全方法似乎不会导致此问题.同样,这个问题似乎是在设备未使用几天之后发生的.

我在这里这里找到了另外两个SO 以及一个Google 问题.如果我理解正确,两者相关的答案似乎都依赖于调用者 …

android android-keystore java-security private-key android-security

17
推荐指数
1
解决办法
1295
查看次数