签名校验原理:
安卓应用程序,使用apkTool.jar,或其他反编译工具很容易被篡改。
为了保证应用程序未被别人修改过,可以在应用中添加签名信息校验逻辑。(当应用被反编译再重新打包后,签名信息无法与我们使用的签名保持一致,进而签名校验不会成功)我们可以在签名校验失败时让其自动退出,或执行我们希望的任意逻辑...
签名验证逻辑:
package com.sc.signature;
import java.security.MessageDigest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
/** Tool.java: ----- 2018-12-28 下午4:04:54 scimence
* 1、获取签名信息 getSignature()
* 2、检测签名信息 CheckSign() */
public class SignTool
{
/** 检测当前应用的签名信息,若不相同则自动退出 */
public static void CheckSign(Activity activity)
{
String sign = getSignature(activity);
if (!sign.equals("b6afc731feca47bb17338c7ba5b20b60")) // 修改此处值为游戏包对应签名
{
activity.finish();
System.exit(0); // 退出运行
}
}
/** 获取应用的签名信息 */
public static String getSignature(Context context)
{
String packageName = getPackageName(context);
String sign = getSign(context, packageName);
return sign;
}
/** 获取acitivty所在的应用包名 */
public static String getPackageName(Context activity)
{
ApplicationInfo appInfo = activity.getApplicationInfo();
String packageName = appInfo.packageName; // 获取当前游戏安装包名
return packageName;
}
/** 获取包名对应应用的签名信息 */
public static String getSign(Context paramContext, String packageName)
{
String S = "";
try
{
byte[] array = null;
PackageInfo localPackageInfo = paramContext.getPackageManager().getPackageInfo(packageName, 64);
for (int i = 0; i < localPackageInfo.signatures.length; i++)
{
array = localPackageInfo.signatures[i].toByteArray();
if (array != null) break;
}
S = MD5(array);
}
catch (Exception ex)
{
}
return S;
}
/** 计算MD5值 */
public static String MD5(String data)
{
try
{
String str = MD5(data.getBytes());
return str;
}
catch (Exception ex)
{}
return null;
}
/** 计算MD5值 */
public static String MD5(byte[] data)
{
try
{
// 获取data的MD5摘要
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// mdInst.update(content.getBytes());
mdInst.update(data);
byte[] md = mdInst.digest();
// 转换为十六进制的字符串形式
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < md.length; i++)
{
String shaHex = Integer.toHexString(md[i] & 0xFF);
if (shaHex.length() < 2)
{
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
}
package com.sc.signature;
import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import com.sci.androidsignature.R;
public class MainActivity extends Activity
{
EditText edit = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
// 显示签名信息
edit = (EditText) this.findViewById(R.id.edit);
String sign = SignTool.getSignature(this);
edit.setText(sign);
SignTool.CheckSign(this); // 检测应用签名,不匹配则自动退出
}
}