我正在构建一个与在线网络服务通信的 Android 应用程序。我计划在 GitHub 上发布应用程序的源代码。对于我的生产版本,它将使用我的个人网络服务,我只想允许我的数字签名 apk 连接。
是否可以请求 APK 的 keystore 并从该 keystore 确认用户名/密码?
如果这不可能,我还能如何实现此功能?
编辑:
我读进了类Certificate看起来我可以使用公钥/私钥来确认身份。但我仍然不确定实现
最佳答案
我用这个——
static public String getPackageFingerPrint( Context ctx ) {
PackageManager pm = ctx.getPackageManager();
String packageName = ctx.getPackageName();
int flags = PackageManager.GET_SIGNATURES;
PackageInfo packageInfo = null;
try {
packageInfo = pm.getPackageInfo(packageName, flags);
} catch (NameNotFoundException e) {
return "";
}
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) {
return "";
}
X509Certificate c = null;
try {
c = (X509Certificate) cf.generateCertificate(input);
} catch (CertificateException e) {
return "";
}
try {
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] publicKey = md.digest(c.getPublicKey().getEncoded());
StringBuffer hexString = new StringBuffer();
for (int i=0;i<publicKey.length;i++) {
String appendString = Integer.toHexString(0xFF & publicKey[i]);
if(appendString.length()==1)hexString.append("0");
hexString.append(appendString);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e1) {
return "";
}
}
我在您的方法中看到的问题是任何人都可以确定包裹指纹或您的包裹并将其发送到您的网络服务。更好的可能性是使用挑战-响应机制:您的网络服务向您发送一个唯一的 session token ,您的应用程序使用共享算法对其进行加密或摘要,然后将此加密 token 发送回您的服务以进行验证。当然,您不会想将该算法发布到 github。
关于android - 使用 keystore 确认 APK 身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18414779/