Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MD5 hashing in Android

I have a simple android client which needs to 'talk' to a simple C# HTTP listener. I want to provide a basic level of authentication by passing username/password in POST requests.

MD5 hashing is trivial in C# and provides enough security for my needs but I can't seem to find how to do this at the android end.

EDIT: Just to address the concerns raised about MD5 weakness - the C# server runs on the PCs of the users of my android client. In many cases, they'll be accessing the server using wi-fi on their own LANs but, at their own risk, they may choose to access it from the internet. Also the service on the server needs to use pass-through for the MD5 to a 3rd party application I have no control over.

like image 773
Squonk Avatar asked Jan 31 '11 00:01

Squonk


People also ask

What is MD5 in Android?

MD5 stands for 'Message Digest algorithm 5'. The MD5 algorithm is used as a cryptographic hash function or a file fingerprint. Often used to encrypt. Often used to encrypt the password in databases, MD5 can also generate a fingerprint file to ensure that a file is the same after a transfer for example.

What is MD5 in phone?

The MD5 message-digest algorithm is a cryptographically broken but still widely used hash function producing a 128-bit hash value. Although MD5 was initially designed to be used as a cryptographic hash function, it has been found to suffer from extensive vulnerabilities.

What is MD5 in hashing?

The MD5 (message-digest algorithm) hashing algorithm is a one-way cryptographic function that accepts a message of any length as input and returns as output a fixed-length digest value to be used for authenticating the original message.


2 Answers

Here is an implementation you can use (updated to use more up to date Java conventions - for:each loop, StringBuilder instead of StringBuffer):

public static String md5(final String s) {     final String MD5 = "MD5";     try {         // Create MD5 Hash         MessageDigest digest = java.security.MessageDigest                 .getInstance(MD5);         digest.update(s.getBytes());         byte messageDigest[] = digest.digest();          // Create Hex String         StringBuilder hexString = new StringBuilder();         for (byte aMessageDigest : messageDigest) {             String h = Integer.toHexString(0xFF & aMessageDigest);             while (h.length() < 2)                 h = "0" + h;             hexString.append(h);         }         return hexString.toString();      } catch (NoSuchAlgorithmException e) {         e.printStackTrace();     }     return ""; } 

Although it is not recommended for systems that involve even the basic level of security (MD5 is considered broken and can be easily exploited), it is sometimes enough for basic tasks.

like image 192
Den Delimarsky Avatar answered Oct 21 '22 20:10

Den Delimarsky


The accepted answer didn't work for me in Android 2.2. I don't know why, but it was "eating" some of my zeros (0) . Apache commons also didn't work on Android 2.2, because it uses methods that are supported only starting from Android 2.3.x. Also, if you want to just MD5 a string, Apache commons is too complex for that. Why one should keep a whole library to use just a small function from it...

Finally I found the following code snippet here which worked perfectly for me. I hope it will be useful for someone...

public String MD5(String md5) {    try {         java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");         byte[] array = md.digest(md5.getBytes("UTF-8"));         StringBuffer sb = new StringBuffer();         for (int i = 0; i < array.length; ++i) {           sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));        }         return sb.toString();     } catch (java.security.NoSuchAlgorithmException e) {     } catch(UnsupportedEncodingException ex){     }     return null; } 
like image 28
Andranik Avatar answered Oct 21 '22 21:10

Andranik