当前位置:   article > 正文

AS自定义keystore获取SHA1_as new key store

as new key store

why?

根据项目需求地图使用高德地图,学习其开发文档时遇到了如何去获取应用的SHA1值的问题.虽然先前有操作过获取SHA1值的相关步骤,但记忆终究是模糊的.于是就想借此机会,认真仔细的将整个流程重新正规的学习一遍,并记录于此,以便日后需要.

How?

1.学习链接:  http://blog.csdn.net/nimasike/article/details/51457229
2.高德开发文档:  http://lbs.amap.com/faq/top/hot-questions/249

keystore 文件为 Android 签名证书文件


步骤开始:

A:keystore的XXX.jks以及apk的创建

1.我在workspace文件夹的附近单独新建了一个属于keystore的文件夹,统一放置所有应用自定义生成的keystore(例如:XXX.jks).以 便日后管理.当然也可根据个人喜好将应用的key store path选择在当前应用比较好找的位置下.
2.创建新的keystore :  Build --->> Generate Signed APK
3.点击对话框的Create New
4.填写相应信息:
key store path: 选择路径 --->> 如步骤1
key store password:密钥库密码
key Alias:别名
key password:秘钥密码
First  and Last Name:根据自己喜好随意填写一个名字
5.步骤4结束后将直接弹出一个需要输入刚刚所设置的密码的界面,输入密码完毕后Next.
6.选择发布app的路径,默认即可.选择release方式发布.
应用的apk就成功生成了,可到对应的文件夹下找到该apk

B:如何在debug时,配置使用自定义的keystore.
1.用刚刚创建的keystore
2.右键项目,选择 Open Module Settings 看图操作 --->> 右边信息填写


3.分别选择debug和release 都设置为刚才填进去的keystore,比如我刚刚上图填写的Name:gaodeditu  看图操作


4.查看APP的配置文件



C:测试apk是否使用了自定义的keystore

1.打开Android Studio的Terminal工具

2.输入命令:keytool -v -list -keystore keystore文件路径(D:\android\workspace\keystore\gaodeditu.jks)

3.输入Keystore密码,便可查看到SHA1值  看图



4.代码获取SHA1值

  1. //这个是获取SHA1的方法
  2. public static String getSHA1(Context context) {
  3. //获取包管理器
  4. PackageManager pm = context.getPackageManager();
  5. //获取当前要获取SHA1值的包名,也可以用其他的包名,但需要注意,
  6. //在用其他包名的前提是,此方法传递的参数Context应该是对应包的上下文。
  7. String packageName = context.getPackageName();
  8. //返回包括在包中的签名信息
  9. int flags = PackageManager.GET_SIGNATURES;
  10. PackageInfo packageInfo = null;
  11. try {
  12. //获得包的所有内容信息类
  13. packageInfo = pm.getPackageInfo(packageName, flags);
  14. } catch (PackageManager.NameNotFoundException e) {
  15. e.printStackTrace();
  16. }
  17. //签名信息
  18. Signature[] signatures = packageInfo.signatures;
  19. byte[] cert = signatures[0].toByteArray();
  20. //将签名转换为字节数组流
  21. InputStream input = new ByteArrayInputStream(cert);
  22. //证书工厂类,这个类实现了出厂合格证算法的功能
  23. CertificateFactory cf = null;
  24. try {
  25. cf = CertificateFactory.getInstance("X509");
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. //X509证书,X.509是一种非常通用的证书格式
  30. X509Certificate c = null;
  31. try {
  32. c = (X509Certificate) cf.generateCertificate(input);
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }
  36. String hexString = null;
  37. try {
  38. //加密算法的类,这里的参数可以使MD4,MD5等加密算法
  39. MessageDigest md = MessageDigest.getInstance("SHA1");
  40. //获得公钥
  41. byte[] publicKey = md.digest(c.getEncoded());
  42. //字节到十六进制的格式转换
  43. hexString = byte2HexFormatted(publicKey);
  44. } catch (NoSuchAlgorithmException e1) {
  45. e1.printStackTrace();
  46. } catch (CertificateEncodingException e) {
  47. e.printStackTrace();
  48. }
  49. return hexString;
  50. }
  51. //这里是将获取到得编码进行16进制转换
  52. private static String byte2HexFormatted(byte[] arr) {
  53. StringBuilder str = new StringBuilder(arr.length * 2);
  54. for (int i = 0; i < arr.length; i++) {
  55. String h = Integer.toHexString(arr[i]);
  56. int l = h.length();
  57. if (l == 1)
  58. h = "0" + h;
  59. if (l > 2)
  60. h = h.substring(l - 2, l);
  61. str.append(h.toUpperCase());
  62. if (i < (arr.length - 1))
  63. str.append(':');
  64. }
  65. return str.toString();
  66. }

这是高德开发文档提供的获取SHA1值的代码.

  1. publicstatic String getSHA1(Context context) {
  2. try {
  3. PackageInfo info = context.getPackageManager().getPackageInfo(
  4. context.getPackageName(), PackageManager.GET_SIGNATURES);
  5. byte[] cert = info.signatures[0].toByteArray();
  6. MessageDigest md = MessageDigest.getInstance("SHA1");
  7. byte[] publicKey = md.digest(cert);
  8. StringBuffer hexString = new StringBuffer();
  9. for (int i = 0; i < publicKey.length; i++) {
  10. String appendString = Integer.toHexString(0xFF & publicKey[i])
  11. .toUpperCase(Locale.US);
  12. if (appendString.length() == 1)
  13. hexString.append("0");
  14. hexString.append(appendString);
  15. hexString.append(":");
  16. }
  17. String result = hexString.toString();
  18. return result.substring(0, result.length()-1);
  19. } catch (NameNotFoundException e) {
  20. e.printStackTrace();
  21. } catch (NoSuchAlgorithmException e) {
  22. e.printStackTrace();
  23. }
  24. return null;
  25. }

以上两种获取方式,亲测可用!!!

end~~~


本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/888877
推荐阅读
相关标签
  

闽ICP备14008679号