大多数应用开发者会将一些第三方库集成到他们的应用中.如果要访问服务,例如Dropbox或YouTube,或者用于记录崩溃.第三方图书馆和服务的数量是惊人的.大多数这些库和服务都是以某种方式通过服务进行身份验证而集成的,大部分时间都是通过API密钥进行的.出于安全目的,服务通常生成公共和私有(通常也称为秘密密钥).不幸的是,为了连接到服务,必须使用此私钥进行身份验证,因此可能是应用程序的一部分.毋庸置疑,这面临着巨大的安全问题.公共和私人API密钥可以在几分钟内从APK中提取,并且可以轻松实现自动化.
假设我有类似的东西,我该如何保护密钥:
public class DropboxService  {
    private final static String APP_KEY = "jk433g34hg3";
    private final static String APP_SECRET = "987dwdqwdqw90";
    private final static AccessType ACCESS_TYPE = AccessType.DROPBOX;
    // SOME MORE CODE HERE
}
您认为存储私钥的最佳和最安全的方式是什么?混淆,加密,你怎么看?
我正在我的应用中实施应用内结算以解锁高级功能.应用内结算功能设置正确.除了"开发者有效载荷"之外,一切似乎都很好.
示例应用程序说
 /*
     * TODO: verify that the developer payload of the purchase is correct. It will be
     * the same one that you sent when initiating the purchase.
     *
     * WARNING: Locally generating a random string when starting a purchase and
     * verifying it here might seem like a good approach, but this will fail in the
     * case where the user purchases an item on one device and then uses your app on
     * a different device, because …我已经完成了在app billing v3中使用的应用程序的开发.我的应用程序是一个考试帮助应用程序,其中包含一系列插入数据库的问题.令我担心的是安全性超越预期,其他几乎没有.我的应用程序查询库存中的已购买商品,因此存储购买不是问题.
因此,第一个问题是有人可以反编译应用程序(我已经完成了),即使使用proguard,您也可以毫不费力地检索所有问题.
接下来是应用程序的公钥.这可以很容易地从我的应用程序中获取,根据开发人员指南,这是我应该保持安全的.
但是我真的不知道如何实现任何形式的安全性.或者甚至我应该走多远才能获得安全保障.没有服务器,如果我将所有内容保留在设备上,我认识到它不会是完美的(远非它),但我至少会喜欢黑客而不是被逗乐.
基本上问题是:
我应该使用什么类型的安全性以及如何使用它?只是指着我一步一步地浏览它的链接,这样我就能理解它会很棒.
非常感谢你!
澄清:
没有涉及服务器.数据存储在应用程序中.当查询库存时(通过queryinventoryasync方法),如果已购买库存,则返回库存,并且每次应用程序启动时都会运行.在应用程序计费本身,我认为是可以的,我要求更多关于我自己的应用程序的应用程序公钥 - 我的意思是以某种方式使复制更难,但目前我已经把它分成15个字符串,我只是"添加"它们在运行时彼此相关,但这几乎没有任何好处,只需将它作为一个字符串.我想以某种方式加密它只是不知道如何.
我对http://developer.android.com/guide/google/play/billing/billing_integrate.html#billing-signatures的一些建议感到困惑
为了保护您的公钥免受恶意用户和黑客的攻击,请不要将您的公钥嵌入整个文字字符串.相反,在运行时从片段构造字符串或使用位操作(例如,XOR与其他字符串)来隐藏实际的键.密钥本身不是秘密信息,但您不希望黑客或恶意用户轻易用其他密钥替换公钥.
这是否意味着
String one = "thisIs";
String two = "MyKey";
String base64EncodedPublicKey = one + two;
PublicKey key = Security.generatePublicKey(base64EncodedPublicKey);
verified = Security.verify(key, signedData, signature);
比...更安全
String base64EncodedPublicKey = "thisIsMyKey";
PublicKey key = Security.generatePublicKey(base64EncodedPublicKey);
verified = Security.verify(key, signedData, signature);
?如果没有,你能否在代码中给我一个如何做到这一点的例子?