關於Android簽名的基本概念,我在以前的文章已經提過:
Android如何簽名javascript
若是不明白的朋友能夠先看看。
咱們在註冊一些應用的時候都是須要咱們輸入簽名的,如:java
可是這個簽名應該如何獲取呢?數組
首先就是經過一些三方應用獲取,好比在分享受權中須要使用簽名,友盟的分享,就爲開發者提供了簽名獲取工具app
這個沒有什麼好說的,我就直接附代碼吧,須要注意的是,要想獲取應用簽名,須要應用的包名,經過包名能夠獲得PackageInfo函數
/** * 獲取簽名的MD5摘要 */
public static String getSignatureDigest(PackageInfo pkgInfo) {
int length = pkgInfo.signatures.length;
if (length <= 0) {
return "";
}
Signature signature = pkgInfo.signatures[0];
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
// Should not occur
}
byte[] digest = md5.digest(signature.toByteArray()); // get digest with md5 algorithm
return toHexString(digest);
}
/** * 將字節數組轉化爲對應的十六進制字符串 */
private static String toHexString(byte[] rawByteArray) {
char[] chars = new char[rawByteArray.length * 2];
for (int i = 0; i < rawByteArray.length; ++i) {
byte b = rawByteArray[i];
chars[i * 2] = HEX_CHAR[(b >>> 4 & 0x0F)];
chars[i * 2 + 1] = HEX_CHAR[(b & 0x0F)];
}
return new String(chars);
}
private static final char[] HEX_CHAR = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};複製代碼
這時候咱們獲得的字符串就是MD5簽名,各個平臺須要填寫的簽名都是全小寫的,經過toLowerCase再轉成小寫便可。工具
private static String facebookHashKey(PackageInfo info) {
try {
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
return Base64.encodeToString(md.digest(), Base64.DEFAULT);
}
} catch (NoSuchAlgorithmException e) {
}
return null;
}複製代碼
有人可能會問函數名爲何叫facebookHashKey,其實當時在用的時候是須要爲Facebook的受權提供KeyHash,後來發現許多國外平臺都須要這個,而國內平臺須要的簽名都是MD5ui
public static String getCertificateSHA1Fingerprint(PackageInfo packageInfo) {
Signature[] signatures = packageInfo.signatures;
byte[] cert = signatures[0].toByteArray();
InputStream input = new ByteArrayInputStream(cert);
CertificateFactory cf = null;
try {
cf = CertificateFactory.getInstance("X509");
} catch (CertificateException e) {
e.printStackTrace();
}
X509Certificate c = null;
try {
c = (X509Certificate) cf.generateCertificate(input);
} catch (CertificateException e) {
e.printStackTrace();
}
String hexString = null;
try {
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] publicKey = md.digest(c.getEncoded());
hexString = byte2HexFormatted(publicKey);
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (CertificateEncodingException e) {
e.printStackTrace();
}
return hexString;
}
private static String byte2HexFormatted(byte[] arr) {
StringBuilder str = new StringBuilder(arr.length * 2);
for (int i = 0; i < arr.length; i++) {
String h = Integer.toHexString(arr[i]);
int l = h.length();
if (l == 1)
h = "0" + h;
if (l > 2)
h = h.substring(l - 2, l);
str.append(h.toUpperCase());
if (i < (arr.length - 1))
str.append(':');
}
return str.toString();
}複製代碼
這種加密方式的簽名如今知道的只有一個俄羅斯平臺在使用。其餘不多有使用這種加密方式的。
更多的開發知識,能夠關注個人公衆號:
加密