android - 如何在 logcat 中获取 android 应用程序的 SHA-1/MD 5 指纹?

标签 android android-studio sha1

制作应用程序后,我希望 Logcat 在其日志中打印应用程序的 SHA-1 key 。

而不是运行

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

命令。

无论应用处于调试/ Release模式。

这可以在 android studio 中完成吗?

当然,在测试之后我会删除 logcat 行,这样其他人可能无法调试它。

最佳答案

就个人而言,我会使用 SHA256 而不是 SHA1。我就是这么做的in SignatureUtilsmy CWAC-Security library :

/***
  Copyright (c) 2014 CommonsWare, LLC

  Licensed under the Apache License, Version 2.0 (the "License"); you may
  not use this file except in compliance with the License. You may obtain
  a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
 */

package com.commonsware.cwac.security;

import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SignatureUtils {
  public static String getOwnSignatureHash(Context ctxt)
                                                        throws NameNotFoundException,
                                                        NoSuchAlgorithmException {
    return(getSignatureHash(ctxt, ctxt.getPackageName()));
  }

  public static String getSignatureHash(Context ctxt, String packageName)
                                                                         throws NameNotFoundException,
                                                                         NoSuchAlgorithmException {
    MessageDigest md=MessageDigest.getInstance("SHA-256");
    Signature sig=
        ctxt.getPackageManager()
            .getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures[0];

    return(toHexStringWithColons(md.digest(sig.toByteArray())));
  }

  // based on https://stackoverflow.com/a/2197650/115145

  public static String toHexStringWithColons(byte[] bytes) {
    char[] hexArray=
        { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
            'C', 'D', 'E', 'F' };
    char[] hexChars=new char[(bytes.length * 3) - 1];
    int v;

    for (int j=0; j < bytes.length; j++) {
      v=bytes[j] & 0xFF;
      hexChars[j * 3]=hexArray[v / 16];
      hexChars[j * 3 + 1]=hexArray[v % 16];

      if (j < bytes.length - 1) {
        hexChars[j * 3 + 2]=':';
      }
    }

    return new String(hexChars);
  }
}

如果您确实需要 SHA1,您应该能够更改 MessageDigest.getInstance() 调用以适应。而且,如果冒号分隔的十六进制数字对不是您想要的输出格式(我选择它来匹配 keytool),您可以将 byte[] 转换为可打印的如果您愿意,可以以其他方式输出。

关于android - 如何在 logcat 中获取 android 应用程序的 SHA-1/MD 5 指纹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32934041/

相关文章:

Android listview simpleAdapter 获取每行最后一列的总和 Textview

java - 检索错误数据

android - 如何使用 android.hardware.camera.external 在 android 中打开 USB 摄像头

java - 如何重置createChooser Intent 中的数据

android - 在 Android Studio 2.0 中,在 Debug模式下找不到方法的局部变量

java - 哈希算法总是在最后返回\r\n

algorithm - 如何使用 Powershell 获取证书的安全哈希算法

Android:Google Map v2 未显示发布 apk 的 map

android - Android Studio 在 Linux PC 上运行速度更快吗?

android - 使用需要比当前 minSdkVersion 更高的 minSdkVersion 的库