RSA签名,Google主要用于APP的来源控制与结算。所谓的结算,也是就是控制了APP只有使用现在机子上登录的Google账户从Google市场曾经下载过该APP的才能够使用,这样也就达到了app销售的目的。

   
 
增加RSA签名主要分为以下几步骤
  1).添加License Verification Library(LVL)库
  2).发布一个测试版(BETA 版)到Google Play市场。
  3).代码中实现签名的认证功能并进行APP的权限控制。
 
以下所有操作都是在Android Studio里面完成。Eclipse可以进行对应参考。
 
一。添加第三方库License Verification Library(LVL)步骤
1,下载LVL库
      打开Android SDK Manager。在库列表Extras下面找到Google Play LIcensing Library。下载之。现在完成该Lib会存放在android-sdk-windows\extras\google\play_licensing\library。
2,添加LVL库到工程中
File---New---Import Module。选择SDK中LVL库。也就是android-sdk-windows\extras\google\play_licensing\library。选择正确,则会出现Module Name。可以自定义这个Lib名字。这里定义为lvl。
 
3,打开App的Grade file。注意:是App目录下的Grade File。一般命名为build.grade。对应位置(dependencies)添加
compile project(':lvl')
 
 4,点击Tools----Android-----Sync Project with Grade Files。完成了第三方库的添加。
 
 
 
二。发布一个测试版到Google 市场
     该步骤和正常发布一个App是一样的。只不过APK上传的时候,选择的是Beta版,非正式版。注意:点击右上角的发布之后才是完成,非上传完APK就算完成了。测试的APP需要添加测试账户到封闭的测试列表里面,也就是手机现已登录的Google账户需要添加到里面,不然无法进行测试。
 
三,实现与签名服务器的交互达到实现控制应用程序的权限的控制
    与签名服务器交互主要通过LicenseChecker这个类。通过LicenseChecker注册一个LicenseCheckerCallback的回调来达到控制APP的目的,一般都是在MainActivity进行与签名服务器的交互工作,在mLicenseCheckerCallback中,如果成功认证APP则继续往下走,否则可以提示退出。
    操作方法如下:
1,添加App的权限
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
2,在MainActivity定义一个20个随机字节的数组(供AESObfuscator使用),和一些变量。
private static final String BASE64_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjynFykMkHwAuVkL22mUo3Z2HkTXbtXzjAktR1xrIAudSnWCYWKoAeWsSGccS+KOinEyTK1/aMPbWFhjqUl08AtMAygaukoFD3OltfKan4At99AJH9BxKNWZCLAAilt7jW1+8PoiaintlLHZpyG2c6VqSET2VRyGCFCXzKq9BnnhJqkGxJagSRf43WhFXHl1nueDDDm4DdmGjAegY2loglRbYq9cuqxSGn8T1c/ebYE2IZn+OjtG0/9+ce6WwGabeTyQi3HVcvwerTVYwT8PAzujcX6epvhtL3Jfvp73QEWojR381e8Fpsw+Qvd+2rnSZNphbSY56f/4wg4OhPGG6twIDAQAB";
private static final byte[] SALT = new byte[] { 13, 32, 81, 65, 53, 82, 18, 100, -69, -17, 51, 81, -13, 86, -10, -40, 19, 45, 63, -7 };
private LicenseChecker mChecker; private LicenseCheckerCallback mLicenseCheckerCallback;
3.定义一个内部LicenseCheckerCallback类
private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
@Override
public void allow(int reason) {
// Log.i("RSA", "success Code: " + reason);
delayedHide(HIDE_DELAY_MILLIS);
} @Override
public void applicationError(int errorCode) {
// Log.i("RSA", "Error Code: " + errorCode);
haveNoLicence();
} @Override
public void dontAllow(int reason) {
Log.i("RSA", "dontAllow Code: " + reason);
if (reason !=Policy.LICENSED){ //not success
haveNoLicence();
}
}
}
   在这个Callback类里面,访问返回方法是dontAllow。在成功的情况下才会调用allow。报错的情况下才会调用applicationError,报错不包括没有license,网络错误等。所以我这里直接是没有认证成功就执行没有权限的方法。
 
4,初始化LicenseChecker和LicenseCheckerCallback
String deviceId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
// Library calls this when it's done.
mLicenseCheckerCallback = new MyLicenseCheckerCallback();
// Construct the LicenseChecker with a policy.
mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, new AESObfuscator(SALT, getPackageName(), deviceId)), Constants.RSA_KEY);
5,访问签名服务器进行校验。
mChecker.checkAccess(mLicenseCheckerCallback);
 
到这里,就完成了RSA的认证了。
 
可能会遇到的问题
1,报错,Error code 3。是由于Google市场没有上传APK。或者还没有发布完成。如果已经完成发布,请等待审核通过。估计24小时内可以通过审核。
2,切换Google账户或者更换应用中的RSA KEY。如果校验结果与想象的结果不相同,则需删除应用并且重启手机再进行测试。
3,其他错误代码列表如下:
LICENSED = Hex: 0x0100, Decimal: 256
NOT_LICENSED = Hex: 0x0231, Decimal: 561
RETRY = Hex: 0x0123, Decimal: 291
LICENSED_OLD_KEY = Hex: 0x2, Decimal: 2
ERROR_NOT_MARKET_MANAGED = Hex: 0x3, Decimal: 3
ERROR_SERVER_FAILURE = Hex: 0x4, Decimal: 4
ERROR_OVER_QUOTA = Hex: 0x5, Decimal: 5
ERROR_CONTACTING_SERVER = Hex: 0x101, Decimal: 257
ERROR_INVALID_PACKAGE_NAME = Hex: 0x102, Decimal: 258
ERROR_NON_MATCHING_UID = Hex: 0x103, Decimal: 259
 

安卓5.0系统不允许隐式调用服务,导致LVL包绑定服务报错。报“Service Intent must be explicit Intent”错误,需修改代码如下:
com.google.android.vending.licensing中的LicenseChecker类中方法checkAccess中的代码:

                     boolean bindResult = mContext
.bindService(
new Intent(
new String(
Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")),
this, // ServiceConnection.
Context.BIND_AUTO_CREATE);

修改为显式调用:

                    String name = new String(
Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="));
Intent serviceIntent = new Intent(name);
serviceIntent.setPackage("com.android.vending");
boolean bindResult = mContext.getApplicationContext().bindService(serviceIntent, this, Context.BIND_AUTO_CREATE);

给APP增加RSA签名的更多相关文章

  1. PHP 做 RSA 签名 生成订单(支付宝例子)

    /组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的16 ...

  2. ionic app打包和签名

    ionic app打包和签名 1.首先在项目根目录执行  ionic platform add android  生成Android平台. 2.配置应用签名:在根目录下执行以下命令 keytool - ...

  3. PHP实现RSA签名生成订单功能【支付宝示例】

    //组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的1 ...

  4. RSA签名验签学习笔记

    RSA私钥签名时要基于某个HASH算法,比如MD5或者SHA1等.之前我一直认为签名的过程是:先对明文做HASH计算,然后用私钥直接对HASH值加密.最近才发现不是那么简单,需要对HASH后的数据进行 ...

  5. RSA签名验签

    import android.util.Base64; import java.security.KeyFactory; import java.security.PrivateKey; import ...

  6. java/php/c#版rsa签名以及java验签实现--转

    在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的功能之一.由于isv使用的开发语言不是单一的,因此sdk需要提供多种语言的版本.譬如java.php.c#.另外,在电子商务尤其是支付领 ...

  7. 开发支付宝支付用DELPHI实现 RSA签名

    近来根据业务需求 在ERP中集成了微信支付,支付宝支付,开发支付宝支付时最大的障碍就是RSA签名,找了很多资料,最终用 下了个libeay32.pas  根据网上资料最终解决了问题 function  ...

  8. java/php/c#版rsa签名以及验签实现

    本文为转载,请转载请注明地址: 原文地址为        http://xw-z1985.iteye.com/blog/1837376 在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的 ...

  9. .NET Core RSA 签名和验签(密钥为 16 进制编码)

    使用 OpenSSL 生成公私钥对,命令: $ openssl genrsa -out rsa_1024_priv.pem $ openssl pkcs8 -topk8 -inform PEM -in ...

随机推荐

  1. 2018软工实践—Alpha冲刺(4)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前后端接口的开发 测试项目运行的服务器环 ...

  2. IIS 7.0 的 ASP.NET 应用程序生命周期概述

    文章:IIS 7.0 的 ASP.NET 应用程序生命周期概述 地址:https://msdn.microsoft.com/zh-cn/library/bb470252(v=vs.100).aspx ...

  3. 4th 课堂SCRM会议旁观记录

    项目名称:基于C#的连连看设计 小组名称:待定 小组成员:张政.张金生.武志远.李权 Master:张政 项目已完成部分: 现阶段已经实现了一定的功能,可以运行使用,进行第一关的游戏. 今天计划要完成 ...

  4. PAT 甲级 1144 The Missing Number

    https://pintia.cn/problem-sets/994805342720868352/problems/994805343463260160 Given N integers, you ...

  5. Kettle 使用Json输入

    import java.math.BigDecimal; private static final String JD="jd"; private static final Str ...

  6. so加载报错:dlopen failed: couldn't map ... Permission denied

    转自:https://blog.csdn.net/u013270444/article/details/60869376 问题描述: 我的应用当中集成了一个安全相关的sdk,而这个sdk中使用的so是 ...

  7. Linux架设DDNS服务器之自动更新脚本

    问题描述:客户端是动态IP,每次连网之后要nsupdate下才可以把客户端的hostname 与IP映射更新到DNS Server上 命令如下: nsupdate -k K*****.key > ...

  8. 在python3中使用urllib.request编写简单的网络爬虫

    转自:http://www.cnblogs.com/ArsenalfanInECNU/p/4780883.html Python官方提供了用于编写网络爬虫的包 urllib.request, 我们主要 ...

  9. 25个Java机器学习工具&库--转载

    本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习算法.这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用.Weka包括一系列的工具,如数据预 ...

  10. ssh-keygen的使用方法及配置authorized_keys两台linux机器相互认证

    一.概述 1.就是为了让两个linux机器之间使用ssh不需要用户名和密码.采用了数字签名RSA或者DSA来完成这个操作 2.模型分析 假设 A (192.168.20.59)为客户机器,B(192. ...