public void getSingInfo() {
try {
PackageManager manager=getPackageManager()
PackageInfo packageInfo=manager.getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
Signature[] signs = packageInfo.signatures;
Signature sign = signs[0];
return parseSignature(sign.toByteArray());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String parseSignature(byte[] signature) {
try {
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(signature));
String pubKey = cert.getPublicKey().toString();
String signNumber = cert.getSerialNumber().toString();
System.out.println("signName:" + cert.getSigAlgName());
System.out.println("pubKey:" + pubKey);
System.out.println("signNumber:" + signNumber);
System.out.println("subjectDN:"+cert.getSubjectDN().toString());
} catch (CertificateException e) {
e.printStackTrace();
return null;
}
}
获取到以上信息可以用来做签名比对。
非android环境下获取签名信息:
private char[] toChars(byte[] mSignature) {
byte[] sig = mSignature;
final int N = sig.length;
final int N2 = N*2;
char[] text = new char[N2];
for(int j=0;j<N;j++){
byte v = sig[j];
int d = (v>>4)&0xf;
text[j*2] = (char)(d >= 10 ? ('a' + d - 10) : ('0' + d));
d = v&0xf;
text[j*2+1] = (char)(d >= 10 ? ('a' + d - 10) : ('0' + d));
}
return text;
}
private java.security.cert.Certificate[] loadCertificates(JarFile jarFile, JarEntry je, byte[] readBuffer) {
try {
InputStream is = jarFile.getInputStream(je);
while(is.read(readBuffer,0,readBuffer.length)!=-1) {
}
is.close();
return (java.security.cert.Certificate[])(je!=null?je.getCertificates():null);
} catch (Exception e) {
e.printStackTrace();
System.err.println("Exception reading "+je.getName()+" in "+jarFile.getName()+": "+e);
}
return null;
}
public String getApkSignInfo(String apkFilePath){
byte[] readBuffer = new byte[8192];
java.security.cert.Certificate[] certs = null;
try{
JarFile jarFile = new JarFile(apkFilePath);
Enumeration entries = jarFile.entries();
while(entries.hasMoreElements()){
JarEntry je = (JarEntry)entries.nextElement();
if(je.isDirectory()){
continue;
}
if(je.getName().startsWith("META-INF/")){
continue;
}
java.security.cert.Certificate[] localCerts = loadCertificates(jarFile,je,readBuffer);
System.out.println("File " + apkFilePath + " entry " + je.getName()+ ": certs=" + certs + " ("+ (certs != null ? certs.length : 0) + ")");
if (certs == null) {
certs = localCerts;
}else{
for(int i=0; i<certs.length; i++){
boolean found = false;
for (int j = 0; j < localCerts.length; j++) {
if (certs[i] != null && certs[i].equals(localCerts[j])) {
found = true;
break;
}
}
if (!found || certs.length != localCerts.length) {
jarFile.close();
return null;
}
}
}
}
jarFile.close();
return new String(toChars(certs[0].getEncoded()));
}catch(Exception e){
e.printStackTrace();
}
return null;
}
分享到:
相关推荐
在Android开发中,数据安全是至关重要的,尤其是在网络通信中传输敏感信息时。RSA是一种非对称加密算法,常用于确保数据的机密性和完整性。本文将深入探讨如何在Android应用中实现RSA加密、解密以及签名和验签的全...
1、将你开发的Android App安装到测试手机上; 2、将此Gen_Signature_Android.apk文件安装到手机上; 3、打开此应用,输入你的App应用的包名(Activity.java的第一行,package后面的内容,例如:...
本文将详细解析“Android签名工具”及其重要性,以及如何使用这类工具对APK进行签名或重签名。 首先,理解Android签名的概念。Android签名是为了确保应用的完整性和开发者身份的一种机制。每个APK在发布前都需要...
Android签名工具为开发者提供了一种简便的方法来查看APK的签名信息,这对于调试、更新或验证应用的签名状态非常有用。理解Android签名机制是每位Android开发者必备的知识,它保障了应用的安全性和用户体验。在实际...
- 验证完整性:通过对比签名信息和APK内容,检查文件是否在传输或存储过程中被修改。 - 身份认证:签名证书能识别开发者,使用户知道谁开发了该应用,有助于建立用户信任。 - 系统权限获取:在Android 10中,签名...
在Android平台上,开发一个能够加载PDF文件、实现电子签名并允许签名可拖拽的应用是一项具有挑战性的任务。本文将深入探讨这一技术实现的关键知识点,包括Android PDF处理、电子签名技术以及用户交互设计。 首先,...
2013年,国家互联网应急中心(CNCERT)发现并通报了一种利用Android签名漏洞的恶意程序——Skullkey扣费木马。该木马通过利用Android操作系统中的签名漏洞,能够悄无声息地植入到正常的应用程序中,进而实现恶意扣费...
在Android开发中,有时我们需要获取应用的签名证书指纹信息,特别是SHA1指纹,这在进行API集成、安全验证或者发布应用到Google Play等场景中非常常见。SHA1是一种广泛使用的哈希函数,可以将任意长度的数据映射为...
3. **输出APK**:签名后的APK会被保存,这个新的APK包含了签名信息,现在可以安全地分发给用户。如果需要,还可以使用Zipalign工具进行优化,以提高应用性能。 4. **验证阶段**:当用户尝试安装APK时,Android系统...
该压缩包文件“Android应用源码PDF手写签名商业源码.zip”主要包含了一个Android应用程序的源代码,用于实现PDF文档的手写签名功能。在移动设备上,这种功能对于签署电子文档尤其有用,例如合同、协议等。让我们深入...
签名包含了开发者的信息以及对APK内容的哈希值,保证了应用未被篡改。Android系统在安装和运行应用时会验证这个签名,确保应用来自可信源并符合安全标准。 在这个特定的工具中,我们提到的是“系统权限的签名”,这...
对齐的作用在于,通过确保数据在4字节边界上对齐,使得Android系统在加载资源时可以使用mmap()函数,提高读取效率。这有助于减少内存拷贝,提高CPU访问速度,从而提升应用的性能。 总的来说,Android应用的签名和...
至于显示签名,可以从本地文件或数据库中读取签名图像,然后用ImageView展示。如果是在网络服务器上存储,可以先下载再显示。此外,还可以通过自定义View来动态绘制签名图像,这在需要实时更新签名时非常有用。 在...
3. **ZIP Align**:签名后,为了优化APK的读取性能,需要执行ZIP对齐操作。这可以通过Android SDK的`zipalign`工具完成: ``` zipalign -v 4 signed MyApp.apk aligned MyApp.apk ``` 三、签名的类型 1. **...
在Android系统中,默认的浏览器应用通常具有读取联系人的权限,以便于用户可以通过输入姓名或电话号码快速填充网页表单。然而,这种行为可能会引起隐私方面的顾虑,有些用户可能不希望他们的联系人数据被浏览器访问...
同时,Android还提供了`/proc/stat`系统文件,开发者可以通过读取该文件解析出CPU使用率,但这通常需要更高的权限。 内存使用率的获取相对复杂,因为Android提供了多种方式来查看内存状态。`ActivityManager....
使用这个工具,用户只需要输入目标包名(即应用的唯一标识符,如`com.example.myapp`),工具就会自动读取并解析APK文件,提取出其中的签名信息。这对于需要验证其他应用签名、进行应用分析或者处理签名问题的开发者...
6. **安全与权限管理**:在处理敏感信息如签名时,必须遵循最佳的安全实践。应用可能需要请求读取和写入文件的权限,以及网络访问权限。此外,源码应确保签名数据的安全,防止未授权访问。 7. **测试与调试**:开发...
1. **Android签名机制**:在Android系统中,每个安装的应用都必须经过数字签名,以验证应用的身份和完整性。签名过程使用私钥对应用的APK文件进行加密,这样只有拥有对应公钥的系统才能解密并安装应用。 2. **Java...
`zipalign`确保Apk中的未压缩数据在4字节边界上对齐,这样Android系统可以利用mmap()函数高效地读取资源。例如,`zipalign -v 4 demo_signed.apk final.apk`命令会对`demo_signed.apk`进行优化并生成`final.apk`。 ...