从Android电子在应用内结算版本3(TrivialDrive)示例应用程序的SDK来
MainActivity.java
/* base64EncodedPublicKey should be YOUR APPLICATION'S PUBLIC KEY
* (that you got from the Google Play developer console). This is not your
* developer public key, it's the *app-specific* public key.
*
* Instead of just storing the entire literal string here embedded in the
* program, construct the key at runtime from pieces or
* use bit manipulation (for example, XOR with some other string) to hide
* the actual key. The key itself is not secret information, but we don't
* want to make it easy for an attacker to replace the public key with one
* of their own and then fake messages from the server.
*/
String base64EncodedPublicKey = "CONSTRUCT_YOUR_KEY_AND_PLACE_IT_HERE";
好吧,我不知道我理解这个安全措施。 我知道如何从谷歌获取应用程序的公共密钥(这已经是Base 64编码)Play开发者控制台。
什么我不理解是这部分
/* Instead of just storing the entire literal string here embedded in the
* program, construct the key at runtime from pieces or
* use bit manipulation (for example, XOR with some other string) to hide
* the actual key
*/
据我所知,这个公共密钥是一个字符串常量,它是由谷歌在应用程序上传过程中给出。
我们如何通过编程方式创建相同的密钥使用任何位操作过程? 已经有人做过了吗? 是否有关于如何做到这一点的任何示例代码?
事情是这样的:
String Base64EncodedPublicKey key = "Ak3jfkd" + GetMiddleBit() + "D349824";
要么
String Base64EncodedPublicKey key =
DecrementEachletter("Bl4kgle") + GetMiddleBit() + ReverseString("D349824");
或任何不把用base64明文关键在一个字符串。 大概也不会密钥存储用base64东西将是一个不错的主意太,因为原料的base64文本片段很容易被发现。
它不是用来保护密钥一个特别好的办法。 但它可以防止一个平凡的攻击,其中有人刚刚经历文字字符串搜索你APK寻找的东西看起来像一个64位编码的公共密钥。 至少你让#$#$ ERS工作一点点。
据推测,如果他们认同你的公钥邪恶的人可以做坏事。 谷歌似乎认为如此,显然。 我能猜出这一步呢,但我不知道我真的想对投机在一个开放的论坛,给任何人任何想法。 你想,虽然做到这一点。
基本情节概要将是你变得更困难某人编写程序去LVLs的应用程序的applciation。
一个假设,任何人谁在做这个为生开裂20个或30,000 Android应用,并重新发布它们。 有机会,我想,他们不会采取额外的十分钟您的应用程序添加至20000个Android应用程序已经被通过程序打破,如果他们真的需要做的手工作业的一点点的列表。 除非你有一个顶级的应用程序。 再战斗中是潜在无穷的,而且很可能最终是徒劳的。
拆分钥匙插入连续区块(如在另一个答案建议)可能是不够好。 由于密钥将在APK字符串常量表中连续的字符串结束。 太容易找到与程序。
另一种方法是做的关键的一些基本变换。
// Replace this with your encoded key.
String base64EncodedPublicKey = "";
// Get byte sequence to play with.
byte[] bytes = base64EncodedPublicKey.getBytes();
// Swap upper and lower case letters.
for (int i = 0; i < bytes.length; i++) {
if(bytes[i] >= 'A' && bytes[i] <= 'Z')
bytes[i] = (byte)( 'a' + (bytes[i] - 'A'));
else if(bytes[i] >= 'a' && bytes[i] <= 'z')
bytes[i] = (byte)( 'A' + (bytes[i] - 'a'));
}
// Assign back to string.
base64EncodedPublicKey = new String( bytes );
这样的想法是把你原来的钥匙作为base64EncodedPublicKey
和运行上面的代码,它会掉较低和大写字母,并把结果返回中base64EncodedPublicKey
。 然后,您可以从结果调试器复制并粘贴到代码作为原始base64EncodedPublicKey
值。 在这一点上你的钥匙将被改造(大小写切换),并在运行时,它会解决它回到正确的外壳,并继续工作。
以上显然是一个相当基本的转码,但你可以更有创意,扭转AZ的顺序,交换奇数和偶数,交换元音为偶数。 这里的问题是,如果我把代码在上面的代码片段,做了一堆更有趣的转码,然后大家复制并粘贴到这一点他们的项目,黑客将能够轻松地查看和使用转码本身(从看这个帖子)! 所以,你只需要拿出一些变换自己。
我特意做两个方向以上工作(所以如果你运行它两次,你会得到你的原始值回),因为它可以很容易地运行您的原始密钥的算法。 我认为这是一种整齐它看起来像真正的关键是坐在那里为纯文本,休闲饼干可以尝试切换这一点,然后是迷茫的时候它不工作。
你可以把它分成这样的碎片
String piece1 = "SDFGJKGB4UIH234WE/FRT23RSDF/3DFUISDFVWE";
String piece2 = "SDFGJKGB4UIHUISDFVWE";
String piece3 = "BDYASGBDNAWGRET24IYE23das4saGBENWKD";
String piece4 = "432423SDF23R/+SDDS";
mHelper = new IabHelper(this, piece1 + piece2 + piece3 + piece4);
任何一种操作都会做。
你不能从攻击者完全隐藏公共密钥,您只需要操作字符串混淆一个攻击者一点点
你可以添加一些字符串,并在需要时将其删除或将其分割成块。
我所做的就是在关键转换成字符数组,它一分为二,然后在需要这样的时候重建它:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shop);
char[] base64KeyByteArray = ArrayUtils.addAll(getPublicKeyChunk1(), getPublicKeyChunk2());
Log.d(TAG, String.valueOf(base64KeyByteArray));
}
private char[] getPublicKeyChunk1() {
return new char[]{82, 73, 67, 66, 73, 106, 65, 78, 66, 103, 107, 113, 104, 107,
105, 71, 57, 119, 79, 66, 65, 81, 69, 70, 65, 65, 79, 67, 65, 81, 56, 65, 77, 73,
73, 66, 67, 103, 75, 67, 65, 81, 69, 65, 121, 55, 81, 76, 122, 67, 105, 80, 65,
110, 105, 101, 72, 66, 53, 57};
}
private char[] getPublicKeyChunk2() {
return new char[]{82, 43, 68, 47, 79, 121, 122, 110, 85, 67, 118, 89, 108, 120, 43, 49,
80, 100, 67, 108, 55, 90, 57, 103, 119, 57, 87, 78, 79, 111, 53, 101, 80, 71,
117, 74, 104, 82, 87, 97, 100};
}
按照3个简单的步骤,以确保API /私用密钥
我们可以用摇篮,以确保API密钥或秘密密钥。 检查我的答案 。
建立在史蒂芬工艺的答复与帮助下,我从拿到gidds
这里有一个更干净的代码。 此外,它交换了对于ASCII字符(37-46),反之亦然数字(0-9)。 写在科特林。
val string = "Hello World 012345679 %&()"
fun String.swapCase() = map {
when {
it.isUpperCase() -> it.toLowerCase()
it.isLowerCase() -> it.toUpperCase()
it.isDigit() -> (37 + (it.toInt() - 48)).toChar()
it.isDefined() -> if (it.toInt() >= 37 && it.toInt() <= 46) (48 + (it.toInt() - 37)).toChar() else it
else -> it
}
}.joinToString("")
println(string.swapCase()) // hELLO wORLD %&'()*+,. 0134
使用此- > https://edge-developer.github.io/BillingGenerator/生成所有的这些苍蝇
难道真的有人需要你的私钥? 我觉得整个想法是取代它。 恕我直言,任何操作都将无效。 邪恶的人做的唯一的事情就是初始化正确的(他自己的密钥)值一行begore谷歌API调用变量。