macOS生成哈希密钥时keytool提示安全风险如何获取密钥
macOS 环境生成 Facebook 安卓登录所需密钥哈希方案
你看到的SHA1withRSA签名算法存在安全风险是高版本JDK内置keytool给出的前瞻性弃用警告,不影响当前导出的密钥哈希有效性——Facebook安卓登录当前校验用的密钥哈希本身就是基于SHA1签名计算的Base64值,只要命令执行完成输出的字符串就是可直接使用的有效值,不需要因为这个警告更换计算逻辑。
快速获取无干扰的有效哈希
如果警告信息挤占终端输出、看不到最终哈希值,直接把keytool的警告流重定向到空设备即可,执行命令:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore 2>/dev/null | openssl sha1 -binary | openssl base64
出现密码提示时输入默认debug密钥库密码android,终端输出的28位长度字符串就是debug环境对应的密钥哈希,可直接填入Facebook开发者平台配置项。
备用方案(适配未来keytool禁用旧签名算法的场景)
如果后续JDK版本彻底禁用SHA1withRSA的证书导出能力,不需要硬改keytool配置,直接在安卓项目内取运行时签名哈希即可,结果100%匹配平台校验规则,不会出现环境差异导致的哈希不匹配问题:
- 把以下代码加到应用入口Activity的
onCreate方法中 - 编译运行debug安装包,在Logcat中过滤
KeyHash标签即可拿到准确值
try { val packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES) packageInfo.signatures.forEach { sig -> val messageDigest = MessageDigest.getInstance("SHA") messageDigest.update(sig.toByteArray()) val keyHash = Base64.encodeToString(messageDigest.digest(), Base64.DEFAULT) Log.d("KeyHash", keyHash.trim()) } } catch (e: Exception) { e.printStackTrace() }
注意事项
- 不要因为安全警告改用SHA256计算哈希,Facebook当前安卓登录校验逻辑仅识别SHA1转Base64的结果,使用其他算法生成的哈希填入后会直接报密钥不匹配、登录失败错误
- 生成正式发布包对应的密钥哈希时,只需要把命令里的keystore路径替换为自己的发布密钥库路径、别名替换为发布密钥别名、输入对应发布密钥库密码即可,重定向警告流的写法同样适用
内容的提问来源于stack exchange,提问作者userName
相关产品推荐
相关产品推荐

