Android: 如何以编程方式获取 SHA1/MD5 指纹?
Android: How to get SHA1/MD5 fingerprint programmatically?
我正在尝试实现一种与我的后端服务器通信的方法,并确保我的后端仅在调用我的应用程序时才应答。
所以我的想法是,我只是将 SHA1/MD5 指纹与 HTTPS POST 请求一起发送,并在后端服务器上对其进行验证。如果指纹匹配,服务器将应答。
所以我的第一个问题是:如何在运行时以编程方式获取这些信息?有可能吗?
第二个问题:有那么容易吗?或者我真的必须设置一个 OAuth 服务器(或使用 google-api)吗?...问题是,我认为 OAuth 对于我的用例来说有点矫枉过正,并且我不想处理 expiration/refresh-token 的事情。
你想做的事是不可能的。您作为 id 发送到服务器的任何内容都可以被另一个应用程序复制。这就是为什么您的用户的密码不在应用程序中的原因 - 来自外部来源的密码是确保请求有效的唯一方法。这只能证明 user 是有效的,而不是来自您的应用程序。
你可以像下面的例子一样生成一个:
private void getKeyHash(String hashStretagy) {
PackageInfo info;
try {
info = getPackageManager().getPackageInfo(BuildConfig.APPLICATION_ID, PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md;
md = MessageDigest.getInstance(hashStretagy);
md.update(signature.toByteArray());
String something = new String(Base64.encode(md.digest(), 0));
Log.e("KeyHash -->>>>>>>>>>>>" , something);
// Notification.registerGCM(this);
}
} catch (PackageManager.NameNotFoundException e1) {
Log.e("name not found" , e1.toString());
} catch (NoSuchAlgorithmException e) {
Log.e("no such an algorithm" , e.toString());
} catch (Exception e) {
Log.e("exception" , e.toString());
}
}
像这样使用:
getKeyHash("SHA");
getKeyHash("MD5");
第一个答案:你可以使用上面的方法,它是安全和独特的,我一直在使用它。
第二个答案:您可以使用 Auth 密钥,但这完全取决于您,您喜欢什么
我已经补充了 Zulqumain Jutt 提出的解决方案,以便能够以通用形式获得结果,例如:
KeyHelper: MD5 56:ff:2f:1f:55:fa:79:3b:2c:ba:c9:7d:e3:b1:d2:af
public class KeyHelper {
/**
* @param key string like: SHA1, SHA256, MD5.
*/
@SuppressLint("PackageManagerGetSignatures") // test purpose
static void get(Context context, String key) {
try {
final PackageInfo info = context.getPackageManager()
.getPackageInfo(BuildConfig.APPLICATION_ID, PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
final MessageDigest md = MessageDigest.getInstance(key);
md.update(signature.toByteArray());
final byte[] digest = md.digest();
final StringBuilder toRet = new StringBuilder();
for (int i = 0; i < digest.length; i++) {
if (i != 0) toRet.append(":");
int b = digest[i] & 0xff;
String hex = Integer.toHexString(b);
if (hex.length() == 1) toRet.append("0");
toRet.append(hex);
}
Log.e(KeyHelper.class.getSimpleName(), key + " " + toRet.toString());
}
} catch (PackageManager.NameNotFoundException e1) {
Log.e("name not found", e1.toString());
} catch (NoSuchAlgorithmException e) {
Log.e("no such an algorithm", e.toString());
} catch (Exception e) {
Log.e("exception", e.toString());
}
}
}
Artur 的 Kotlin 版本
示例密钥字符串:“SHA1”或“SHA256”或“MD5”。
fun getSig(context: Context, key: String) {
try {
val info = context.packageManager.getPackageInfo(
BuildConfig.APPLICATION_ID,
PackageManager.GET_SIGNATURES
)
for (signature in info.signatures) {
val md = MessageDigest.getInstance(key)
md.update(signature.toByteArray())
val digest = md.digest()
val toRet = StringBuilder()
for (i in digest.indices) {
if (i != 0) toRet.append(":")
val b = digest[i].toInt() and 0xff
val hex = Integer.toHexString(b)
if (hex.length == 1) toRet.append("0")
toRet.append(hex)
}
val s = toRet.toString()
Log.e("sig", s)
}
} catch (e1: PackageManager.NameNotFoundException) {
Log.e("name not found", e1.toString())
} catch (e: NoSuchAlgorithmException) {
Log.e("no such an algorithm", e.toString())
} catch (e: Exception) {
Log.e("exception", e.toString())
}
}
我正在尝试实现一种与我的后端服务器通信的方法,并确保我的后端仅在调用我的应用程序时才应答。
所以我的想法是,我只是将 SHA1/MD5 指纹与 HTTPS POST 请求一起发送,并在后端服务器上对其进行验证。如果指纹匹配,服务器将应答。
所以我的第一个问题是:如何在运行时以编程方式获取这些信息?有可能吗?
第二个问题:有那么容易吗?或者我真的必须设置一个 OAuth 服务器(或使用 google-api)吗?...问题是,我认为 OAuth 对于我的用例来说有点矫枉过正,并且我不想处理 expiration/refresh-token 的事情。
你想做的事是不可能的。您作为 id 发送到服务器的任何内容都可以被另一个应用程序复制。这就是为什么您的用户的密码不在应用程序中的原因 - 来自外部来源的密码是确保请求有效的唯一方法。这只能证明 user 是有效的,而不是来自您的应用程序。
你可以像下面的例子一样生成一个:
private void getKeyHash(String hashStretagy) {
PackageInfo info;
try {
info = getPackageManager().getPackageInfo(BuildConfig.APPLICATION_ID, PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md;
md = MessageDigest.getInstance(hashStretagy);
md.update(signature.toByteArray());
String something = new String(Base64.encode(md.digest(), 0));
Log.e("KeyHash -->>>>>>>>>>>>" , something);
// Notification.registerGCM(this);
}
} catch (PackageManager.NameNotFoundException e1) {
Log.e("name not found" , e1.toString());
} catch (NoSuchAlgorithmException e) {
Log.e("no such an algorithm" , e.toString());
} catch (Exception e) {
Log.e("exception" , e.toString());
}
}
像这样使用:
getKeyHash("SHA");
getKeyHash("MD5");
第一个答案:你可以使用上面的方法,它是安全和独特的,我一直在使用它。
第二个答案:您可以使用 Auth 密钥,但这完全取决于您,您喜欢什么
我已经补充了 Zulqumain Jutt 提出的解决方案,以便能够以通用形式获得结果,例如:
KeyHelper: MD5 56:ff:2f:1f:55:fa:79:3b:2c:ba:c9:7d:e3:b1:d2:af
public class KeyHelper {
/**
* @param key string like: SHA1, SHA256, MD5.
*/
@SuppressLint("PackageManagerGetSignatures") // test purpose
static void get(Context context, String key) {
try {
final PackageInfo info = context.getPackageManager()
.getPackageInfo(BuildConfig.APPLICATION_ID, PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
final MessageDigest md = MessageDigest.getInstance(key);
md.update(signature.toByteArray());
final byte[] digest = md.digest();
final StringBuilder toRet = new StringBuilder();
for (int i = 0; i < digest.length; i++) {
if (i != 0) toRet.append(":");
int b = digest[i] & 0xff;
String hex = Integer.toHexString(b);
if (hex.length() == 1) toRet.append("0");
toRet.append(hex);
}
Log.e(KeyHelper.class.getSimpleName(), key + " " + toRet.toString());
}
} catch (PackageManager.NameNotFoundException e1) {
Log.e("name not found", e1.toString());
} catch (NoSuchAlgorithmException e) {
Log.e("no such an algorithm", e.toString());
} catch (Exception e) {
Log.e("exception", e.toString());
}
}
}
Artur 的 Kotlin 版本 示例密钥字符串:“SHA1”或“SHA256”或“MD5”。
fun getSig(context: Context, key: String) {
try {
val info = context.packageManager.getPackageInfo(
BuildConfig.APPLICATION_ID,
PackageManager.GET_SIGNATURES
)
for (signature in info.signatures) {
val md = MessageDigest.getInstance(key)
md.update(signature.toByteArray())
val digest = md.digest()
val toRet = StringBuilder()
for (i in digest.indices) {
if (i != 0) toRet.append(":")
val b = digest[i].toInt() and 0xff
val hex = Integer.toHexString(b)
if (hex.length == 1) toRet.append("0")
toRet.append(hex)
}
val s = toRet.toString()
Log.e("sig", s)
}
} catch (e1: PackageManager.NameNotFoundException) {
Log.e("name not found", e1.toString())
} catch (e: NoSuchAlgorithmException) {
Log.e("no such an algorithm", e.toString())
} catch (e: Exception) {
Log.e("exception", e.toString())
}
}