安全存储客户端密码

时间:2015-02-19 14:57:31

标签: android security encryption oauth secret-key

我知道public client shouldn't use a client secret,因为无论你多么混淆它,它都不会受到reverse engineering的保护。

但是,负责我正在验证的服务的人不想/不能改变它。所以,我需要存储客户端的秘密,尽量保护它免受逆向工程的影响。

所以,我想过使用gradle在构建时加密它并将其存储在文件中。然后,当我在运行时需要它时,我解密它。但现在我必须解决如何存储加密密钥 ...

的问题

我对安全性知之甚少,所以,我不知道这是否可以解决,或者Android(min sdk 15)是否为这种情况提供了任何机制。

有什么想法吗?

5 个答案:

答案 0 :(得分:4)

This article建议这些选项,从更少到更安全:

  1. 以明文形式存储

  2. 使用对称密钥加密存储

  3. 使用Android密钥库

  4. 使用非对称密钥加密存储

  5. 使用#4和某种方式组合识别设备可能足够安全

答案 1 :(得分:2)

也许最好的选择是使用NDK,因为它无法反编译,就像Godfrey Nolan点here

这是我发现有用的资源,帮助我实现它link to the resource

干杯

答案 2 :(得分:1)

正如你所说,无论你做什么,你试图隐藏你的钥匙多少,你都无法100%隐藏它。 但是,如果你想让逆向工程师的工作更加努力;

首先混淆你的客户(我猜你已经这样做了)。

其次,不要将密钥放入客户端进行硬编码。登录后或用户打开应用程序后接收密钥。并通过SSL向客户端提供密钥。将密钥存储为字节数组,不要将其保存到客户端。只需存储在内存中。

这些步骤并不能保证密钥的安全,但却使逆向工程师的工作变得非常困难。

答案 3 :(得分:0)

您还可以尝试Dexguard对数据进行模糊处理和加密。 Dexguard是由开发proguard的同一个人制作的。

答案 4 :(得分:0)

@ Semih的回答是在正确的轨道上。秘密关键部分是需要扩展的部分。

  1. 密钥位于应用程序和网关服务器之间,而不是底层服务。
  2. 网关服务器负责将该密钥转换为特定于服务的内容。
  3. 在登录过程完成后使用以下内容构建密钥

    1. 服务器生成特定于登录客户端的密钥对。
    2. 发送服务器的公钥以进行特定于登录的客户端的加密
    3. 该应用会根据自己的目的生成密钥对
    4. 应用程序将发送使用服务器的公钥加密的公钥
    5. 服务器将验证公钥是否使用其公钥签名。
    6. 以后的任何请求都会涉及以下内容

      从客户端发送到服务器的所有数据都将使用JWT加密,消息将由应用程序的私钥签名,并使用服务器的公钥进行加密。

      问题在于保护#1任何人都可以登录并启动流程,那么您将如何防止这种情况发生?我能想到的唯一方法就是在登录时进行CAPTCHA检查。

      该解决方案将客户端机密的存储推送到服务器而不是应用程序本身,并使用应用程序的凭据保护它。