安卓,应用签名校验

签名校验原理:

      安卓应用程序,使用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);	// 检测应用签名,不匹配则自动退出
	}
}

完整源码下载

猜你喜欢

转载自blog.csdn.net/scimence/article/details/85634053