Prachi Kshirsagar
Prachi Kshirsagar

Reputation: 1151

How can I get the MD5 fingerprint from Java's keytool, not only SHA-1?

As I want to use Google maps in my application, I need the debug certificates' MD5 fingerprint. I tried following.:

(Here I copied the debug.keystore file from C:\Documents and Settings\Administrator.android in bin folder)

C:\Program Files\Java\jdk1.7.0\bin>keytool -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android

But got the following results:

androiddebugkey, May 27, 2011, PrivateKeyEntry,Certificate fingerprint (SHA1): "some code"

However that is not working to get MAP API key. Is SHA1 is same as MD5?

What should I do to get the MD5 certificate?

Upvotes: 112

Views: 90319

Answers (14)

Eiji
Eiji

Reputation: 21

This worked for me in 2024

./gradlew signingReport

Upvotes: 1

Chihiro
Chihiro

Reputation: 417

.Hello in the year 2023.

I have crafted a Java code snippet to generate and display relevant information such as MD5. Feel free to give it a try using the following code:

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.util.Enumeration;

public class KeyStoreInfo {

    public static void main(String[] args) {
        if (args.length != 2) {
            System.err.println("Usage: java KeyStoreInfo <keystore-path> <keystore-password>");
            System.exit(1);
        }

        String keystorePath = args[0];
        String keystorePassword = args[1];

        try {
           
            FileInputStream is = new FileInputStream(keystorePath);
            KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
         
            keystore.load(is, keystorePassword.toCharArray());

            Enumeration<String> enumeration = keystore.aliases();
            while (enumeration.hasMoreElements()) {
                String alias = enumeration.nextElement();
                Certificate certificate = keystore.getCertificate(alias);
                PublicKey publicKey = certificate.getPublicKey();

      
                System.out.println("Alias Name: " + alias);
                System.out.println("Public Key: " + publicKey);

          
                System.out.println("Certificate: " + certificate.toString());

                System.out.println("MD5 Fingerprint: " + getFingerprint(certificate, "MD5"));
                System.out.println("SHA-1 Fingerprint: " + getFingerprint(certificate, "SHA-1"));
                System.out.println("SHA-256 Fingerprint: " + getFingerprint(certificate, "SHA-256"));
                System.out.println("---");
            }

            is.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   private static String getFingerprint(Certificate certificate, String algorithm) {
      try {
          MessageDigest md = MessageDigest.getInstance(algorithm);
          byte[] publicKey = certificate.getEncoded();
          md.update(publicKey);
          byte[] digest = md.digest();

          StringBuilder hexString = new StringBuilder();
          for (byte b : digest) {
              String hex = Integer.toHexString(0xff & b);
              if (hex.length() == 1) hexString.append('0');
              hexString.append(hex);
              hexString.append(":");  
          }
          hexString.deleteCharAt(hexString.length() - 1);
          return hexString.toString().toUpperCase(); 
      } catch (Exception e) {
          e.printStackTrace();
          return null;
      }
}

}

How to use:

  1. javac -encoding UTF-8 KeyStoreInfo.java

  2. java KeyStoreInfo your_app.keystore_path your_keystore_password

Upvotes: 0

Abel Rodr&#237;guez
Abel Rodr&#237;guez

Reputation: 652

As Paul Crinigan suggests here you can obtain the MD5 hash running the following command:

keytool -exportcert -v -alias keystore_alias -keystore "path\to\keystore\my.keystore" | openssl dgst -md5

where:

  • keystore_alias is your keystore's alias in case you have one.
  • path\to\keystore\my.keystore is the path to your keystore file.

After running the command you will be asked for the keystore password in case you have set one. The output will be a hash like this:

(stdin)= 8a7b562730f9581c2161bf3984e7af5e

The MD5 will be the output hash inserting the colon : symbol every 2 chars:

8a:7b:56:27:30:f9:58:1c:21:61:bf:39:84:e7:af:5e

Upvotes: 2

Alexander Farber
Alexander Farber

Reputation: 22958

Hello in the year 2021.

The keytool of JDK 8 and newer does not print MD5 anymore, even if you try the standard suggestion to add the "-v" option to the "keygen -list" command.

I guess MD5 is no more considered secure enough and has been removed.

At the same time there are still places like Amazon "Security Profile Management" for LWA etc. requiring you to submit the MD5 signature of your certificate.

Here is a command which will deliver it (use the password "android" for the Android Studio keystore):

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | \
openssl dgst -md5 

And if you want to have colon character inbetween, then add the following "sed" command:

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | \
openssl dgst -md5 | \
sed 's/[a-fA-F0-9][a-fA-F0-9]/&:/g; s/:$//'

The above command works on Linux, macOS and even Windows (in git bash):

git bash screenshot

Upvotes: 20

Sk Saqlain Ali
Sk Saqlain Ali

Reputation: 81

The easiest way to get SHA 1,MD 5 is to click on Gradle in the upper hand right side near the corner of the screen of Android Studio. Then click on the name of the app(e.g android123(root): it should appear like this). After that, you will find a subfolder named android and clicking on it go for the signingReport.It should run in the console and should show you the SHA 1,MD 5. Hope it helps.

Upvotes: 6

Aishvarya Jaiswal
Aishvarya Jaiswal

Reputation: 1811

Simply export your project using your keystore in eclipse and in the last step you will get both SHA-1 and MD-5..

enter image description here

Look at this question for more details.

Upvotes: 1

user2775593
user2775593

Reputation:

I have solved the problem in Windows 8 by opening the Command Prompt (Admin), then type:

C:\Program Files (x86)\Java\jre7\bin>keytool -v -list -keystore C:\<Your Path>\<Your Keystore>

After that, simply go to https://code.google.com/apis/console/

As they changed to a new interface, you have to go to the APIs & auth tab on the left side, then go to Registered Apps, select your existing API key to replace it or create a new one, using the SHA1 code generated previously.

That's how I got it working.

Upvotes: 2

Crishnan Kandada
Crishnan Kandada

Reputation: 651

To get MD5 value and SHA1...etc fallow this below:

Before this dont forget to copy the debug.keystore to a folder Androidkeystore like that created in C drive.

C:\Program Files\Java\jdk1.7.0_05\bin>keytool -v -list -keystore C:\Androidkeyst
ore\debug.keystore

it asks here.. Enter keystore password: android

enter you got here MD5 & SHA1..etc

Keystore type: JKS
Keystore provider: SUN

Your keystore contains ? entry

Alias name: androiddebugkey
Creation date: ?? ???, ????
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[?]:
Owner: CN=Android Debug, O=Android, C=US
Issuer: CN=Android Debug, O=Android, C=US
Serial number: 67b6344b
Valid from: Mon Jun 18 20:33:56 IST 2012 until: Wed Jun 11 20:33:56 IST 2042
Certificate fingerprints:
         MD5:  C2:61:51:3E:BC:C8:0C:DB:75:B6:E7:C4:90:AD:91:39
         SHA1: CD:5E:8A:0F:4E:0F:2E:FD:92:5E:5E:4R:CF:F8:44:33:2C:8C:B8:97
         SHA256: B5:BF:75:60:DB:62:09:49:F1:38:CH:49:18:22:18:95:03:C9:5C:14:F6:
B0:F4:21:D2:19:B8:FF:38:D2:B9:FD
         Signature algorithm name: SHA256withRSA

NOTE: if there are any spaces in the directory path you MUST enclose it in quotes. e.g. use this format:

-keystore "C:\Users\Your Name\.android\debug.keystore"

Upvotes: 27

Karan Kalra
Karan Kalra

Reputation: 413

The -v flag gives the SHA1 certification as well. Without that flag you only get the MD5 fingerprint.

Upvotes: 3

wiz
wiz

Reputation: 57

add -v

right after keytool and before -list

keytool -v -list

Upvotes: 4

fjs
fjs

Reputation: 131

If you are using jdk 7:

Use -v option.

Upvotes: 7

fgeorgiew
fgeorgiew

Reputation: 1204

It's not true that JDK 1.7 keytool ALWAYS return SHA1 fingerprint. Look there to solve the problem instead of downgrade your JDK: http://code.google.com/p/android/issues/detail?id=19035#makechanges

Upvotes: 1

phoenix
phoenix

Reputation: 31

copy ' debug.keystore ' file to c:\ or Some folder

you try going c:\Program Files\Java\jdk1.6.25\bin folder and input

c:\Program Files\Java\jdk1.6.25\bin>keytool -list -keystore c:\debug.keystore

password is 'android'

Upvotes: 3

Ankit Saxena
Ankit Saxena

Reputation: 2319

With JDK 1.7 installed, keytool always outputs by default SHA1 fingerprint, not MD5. you can get the MD5 Certificate by adding -v option.

use the following code:-

C:\Program Files\Java\jdk1.7.0\bin>keytool -v -list -alias
androiddebugkey -keystore debug.keystore -storepass android -keypass android

it will output MD5 certificate as well.

Upvotes: 195

Related Questions