我知道public client shouldn't use a client secret,因为无论你多么混淆它,它都不会受到reverse engineering的保护。
但是,负责我正在验证的服务的人不想/不能改变它。所以,我需要存储客户端的秘密,尽量保护它免受逆向工程的影响。
所以,我想过使用gradle在构建时加密它并将其存储在文件中。然后,当我在运行时需要它时,我解密它。但现在我必须解决如何存储加密密钥 ...
的问题我对安全性知之甚少,所以,我不知道这是否可以解决,或者Android(min sdk 15)是否为这种情况提供了任何机制。
有什么想法吗?
答案 0 :(得分:4)
This article建议这些选项,从更少到更安全:
以明文形式存储
使用对称密钥加密存储
使用Android密钥库
使用非对称密钥加密存储
使用#4和某种方式组合识别设备可能足够安全
答案 1 :(得分:2)
答案 2 :(得分:1)
正如你所说,无论你做什么,你试图隐藏你的钥匙多少,你都无法100%隐藏它。 但是,如果你想让逆向工程师的工作更加努力;
首先混淆你的客户(我猜你已经这样做了)。
其次,不要将密钥放入客户端进行硬编码。登录后或用户打开应用程序后接收密钥。并通过SSL向客户端提供密钥。将密钥存储为字节数组,不要将其保存到客户端。只需存储在内存中。
这些步骤并不能保证密钥的安全,但却使逆向工程师的工作变得非常困难。
答案 3 :(得分:0)
您还可以尝试Dexguard对数据进行模糊处理和加密。 Dexguard是由开发proguard的同一个人制作的。
答案 4 :(得分:0)
@ Semih的回答是在正确的轨道上。秘密关键部分是需要扩展的部分。
在登录过程完成后使用以下内容构建密钥
以后的任何请求都会涉及以下内容
从客户端发送到服务器的所有数据都将使用JWT加密,消息将由应用程序的私钥签名,并使用服务器的公钥进行加密。
问题在于保护#1任何人都可以登录并启动流程,那么您将如何防止这种情况发生?我能想到的唯一方法就是在登录时进行CAPTCHA检查。
该解决方案将客户端机密的存储推送到服务器而不是应用程序本身,并使用应用程序的凭据保护它。