安卓获取某apk的签字信息,可用作防盗版进入

安卓获取某apk的签名信息,可用作防盗版进入。

    

              一般项目中有防盗版的需求,必须是正版软件才能使用,这就需要获取当前安装包的签名信息和提前规定的签名,Md5值做验证,或者发布时候要检验apk签名信息以防止发错包,造成不必要的损失。


    获取签名信息,通过遍历已安装的apk 获得安装过的对应apk是否与已知apk签名一致

,包名你也可以指定任意已安装过的apk,可以获取第三方apk的签名哦


/**
	 * 获取签名信息
	 * 
	 * @param aContext
	 *            Context
	 * @return 签名String
	 */
	@SuppressWarnings("unused")
	private byte[] getSign(String mPakgeName) {

		List<PackageInfo> apps = pManager.getInstalledPackages(PackageManager.GET_SIGNATURES);

		Iterator<PackageInfo> iter = apps.iterator();

		PackageInfo info;
		while (iter.hasNext()) {
			info = iter.next();
			
			if (TextUtils.equals(info.packageName, mPakgeName)) {
				if (info.signatures.length > 0) {
					return info.signatures[0].toCharsString().getBytes();
				}
			}
		}
		return null;
	}

 2   得到字节后 ,需要转化出成md5


	 /** 得到签名.
	 * @param mPakgeName
	 * @return
	 */
	private String  getgetSignMd5(String mPakgeName) {
		    byte[] signatture = getSign(mPakgeName);
		    
		    if (signatture == null) {
	            return null;
	        }

		    if (TextUtils.isEmpty(signatture.toString()))  {
		       return null;
		    }
		    
	    	try {
				digest = MessageDigest.getInstance("Md5");
				digest.update(signatture);
			} catch (NoSuchAlgorithmException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	    	
			//此处为第三方应用使用的签名算法
	    	  byte[] b = digest.digest();
	    	  char[] HEXCHAR = {
	    			  //列举一个签名算法 ,此处应是你方应用自己的算法
	                  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
	                  'a', 'b', 'c', 'd', 'e', 'f'
	          };
	          StringBuilder sb = new StringBuilder(b.length * 2);

	          for (int i = 0; i < b.length; i++) {
	              sb.append(HEXCHAR[(b[i] & 0xf0) >>> 4]);
	              sb.append(HEXCHAR[(b[i] & 0x0f)]);
	          }
	    	
			return sb.toString();
	 }

  3 有时候我们需要获得非系统apk应用信息

/** 获取非预装的app
	 * @return
	 */
	public static List<PackageInfo> getAllApps() { 
	    apps = new ArrayList<PackageInfo>(); 
	    paklist = pManager.getInstalledPackages(0); 
	    for (int i = 0; i < paklist.size(); i++) { 
	        PackageInfo pak = (PackageInfo) paklist.get(i); 
	        //判断是否为非系统预装的应用程序 
	        if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) { 
	           
	            apps.add(pak); 
	        } 
	    } 
	    return apps; 
	}


 xml 布局很简单 因此不再多说 不说了。比如获取微博的签名信息(传入微博的包名即可)。