如何在 android volley 中使用 ssl 时提高安全性
how to increase security while using ssl in android volley
我正在为我的问题搜索 2 天,但我没有找到它。
我的问题:
我的服务器上安装了 comodo ssl/tls 证书,我正在使用 android volley 库连接到服务器,直到现在我只使用 "https://..." 作为我的 url 并通过 https 连接到我的服务器没有问题。
但我最近在我的 phone 上安装了 "packet capture" android 应用程序,默认设置和一个未 root 的 phone 它无法从我的应用程序检索 post/response 信息到服务器,但是当您使用有根 phone 时,数据包捕获应用程序会要求您在 phone 上安装自定义证书,以便它甚至可以检索 ssl/tls 连接,起初我认为它是开玩笑,但在安装证书后,它显示了用于 ssl 连接到我的服务器的全部信息......
我非常担心我的应用程序的安全性,黑客可以使用该捕获应用程序知道将什么发送到我的服务器并将他的硬币编号设置为例如 100000 :(
请告诉我一种使我的应用程序连接更安全的方法。
* 我没有在应用程序上安装自定义证书,因为服务器证书是可信的并且在默认情况下工作正常。
对不起,我的英文打字很糟糕:)
编辑:
感谢@Ch4t4r 的想法...我确实搜索并找到了用于固定 public 键的这个,它太棒了,这是 github link :
https://github.com/faruktoptas/volley-public-key-pinning
希望对遇到同样问题的人有所帮助
应用程序的工作方式如下(总结):
- 您的应用尝试与您的服务器建立连接
- 应用捕获请求并转发
- 应用程序从服务器捕获答案并替换其证书
这是一种经典的中间人攻击,之所以有效,是因为您正在使用的应用程序的证书是可信的。您无法阻止 root 用户破坏您的加密。
您唯一能做的就是默默无闻地确保安全。尝试对您的值进行编码(补充值,或使用存储在您的应用程序中的密钥对其进行加密)或发送整个请求的哈希值。这会将大多数人(非技术人员)拒之门外,但没有绝对的方法可以阻止用户以这种方式作弊。您还可以做的是使用一次性标记(一种盐的工作方式)来编码您的重要值。混淆您的源代码也会有所帮助。但同样,没有绝对的方法,这只是为用户铺路,甚至可能会作弊。它显着增加了弄清楚如何这样做所需的时间。
我不会在上面浪费太多时间,原因如下:
- 大约 20-25% 的 Android 设备已 root(根据一些较旧的数据。我想实际上更少)
- 一些获得 Root 权限的设备是测试或存储设备(Kiosk 模式);让它成为所有 root 设备的 15%
- 如果 50% 的其他 root 用户知道该应用程序(不会那么高),我们将下降到所有 Android 用户的 8.5%
- 只有非常精通技术的用户才能使用隐蔽性安全原则来想出如何作弊。如果符合上述条件的所有用户中有 20%(同样,这是一个非常高的数字),那么我们占所有 Android 用户的 1.7%。
- 考虑到并非所有这些用户都可能使用您的应用程序,有些人可能根本不在乎,我会将能够作弊并使用您的应用程序的用户的百分比设置为 0.5% .
一种更激进的方法是阻止所有 root 用户。
编辑:另一个答案表明您可以使用 public-key pinning。请记住,并非所有用户都倾向于在您发布新版本后立即进行更新,如果他们不这样做,您的应用程序将变得毫无用处。因此它具有较小的风险。
我不确定你的应用程序是用什么编程语言编写的,但你可以查看证书固定以防止这些攻击。您的代码会在发送任何请求之前检查 SSL 证书,如果值不匹配,您的应用可能会失败并显示错误消息。
https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning
github 上有一个 java 库,其中有一些示例。
https://github.com/Flowdalic/java-pinning/blob/master/README.md
我正在为我的问题搜索 2 天,但我没有找到它。
我的问题:
我的服务器上安装了 comodo ssl/tls 证书,我正在使用 android volley 库连接到服务器,直到现在我只使用 "https://..." 作为我的 url 并通过 https 连接到我的服务器没有问题。 但我最近在我的 phone 上安装了 "packet capture" android 应用程序,默认设置和一个未 root 的 phone 它无法从我的应用程序检索 post/response 信息到服务器,但是当您使用有根 phone 时,数据包捕获应用程序会要求您在 phone 上安装自定义证书,以便它甚至可以检索 ssl/tls 连接,起初我认为它是开玩笑,但在安装证书后,它显示了用于 ssl 连接到我的服务器的全部信息...... 我非常担心我的应用程序的安全性,黑客可以使用该捕获应用程序知道将什么发送到我的服务器并将他的硬币编号设置为例如 100000 :(
请告诉我一种使我的应用程序连接更安全的方法。 * 我没有在应用程序上安装自定义证书,因为服务器证书是可信的并且在默认情况下工作正常。
对不起,我的英文打字很糟糕:)
编辑: 感谢@Ch4t4r 的想法...我确实搜索并找到了用于固定 public 键的这个,它太棒了,这是 github link : https://github.com/faruktoptas/volley-public-key-pinning
希望对遇到同样问题的人有所帮助
应用程序的工作方式如下(总结):
- 您的应用尝试与您的服务器建立连接
- 应用捕获请求并转发
- 应用程序从服务器捕获答案并替换其证书
这是一种经典的中间人攻击,之所以有效,是因为您正在使用的应用程序的证书是可信的。您无法阻止 root 用户破坏您的加密。
您唯一能做的就是默默无闻地确保安全。尝试对您的值进行编码(补充值,或使用存储在您的应用程序中的密钥对其进行加密)或发送整个请求的哈希值。这会将大多数人(非技术人员)拒之门外,但没有绝对的方法可以阻止用户以这种方式作弊。您还可以做的是使用一次性标记(一种盐的工作方式)来编码您的重要值。混淆您的源代码也会有所帮助。但同样,没有绝对的方法,这只是为用户铺路,甚至可能会作弊。它显着增加了弄清楚如何这样做所需的时间。
我不会在上面浪费太多时间,原因如下:
- 大约 20-25% 的 Android 设备已 root(根据一些较旧的数据。我想实际上更少)
- 一些获得 Root 权限的设备是测试或存储设备(Kiosk 模式);让它成为所有 root 设备的 15%
- 如果 50% 的其他 root 用户知道该应用程序(不会那么高),我们将下降到所有 Android 用户的 8.5%
- 只有非常精通技术的用户才能使用隐蔽性安全原则来想出如何作弊。如果符合上述条件的所有用户中有 20%(同样,这是一个非常高的数字),那么我们占所有 Android 用户的 1.7%。
- 考虑到并非所有这些用户都可能使用您的应用程序,有些人可能根本不在乎,我会将能够作弊并使用您的应用程序的用户的百分比设置为 0.5% .
一种更激进的方法是阻止所有 root 用户。
编辑:另一个答案表明您可以使用 public-key pinning。请记住,并非所有用户都倾向于在您发布新版本后立即进行更新,如果他们不这样做,您的应用程序将变得毫无用处。因此它具有较小的风险。
我不确定你的应用程序是用什么编程语言编写的,但你可以查看证书固定以防止这些攻击。您的代码会在发送任何请求之前检查 SSL 证书,如果值不匹配,您的应用可能会失败并显示错误消息。
https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning
github 上有一个 java 库,其中有一些示例。
https://github.com/Flowdalic/java-pinning/blob/master/README.md