Is it possible to convert String into an NTLM hash? Are there libraries in Java that I can import, or is there a method I can use to get it?
            Asked
            
        
        
            Active
            
        
            Viewed 1,995 times
        
    3
            
            
        - 
                    I guess the whole thing is: what class does represent an NTML hash. What I mean is: you are probably talking about some specific implementation of that thing; coming from some specific library. Shouldn't you be looking into that very library to figure the ways how you can create "NTML hash" objects in that library?! – GhostCat Dec 29 '16 at 14:25
- 
                    2I have searched the web high and low, and I still don’t know what NTML is. Every search result I found is a misspelling of NTLM. Did you mean NTLM? – VGR Dec 29 '16 at 14:30
- 
                    @VGR yes i ment NTLM sorry – Racing121 Dec 29 '16 at 14:32
- 
                    1http://security.stackexchange.com/questions/128685/help-converting-string-to-ntlm => https://myotherpcisacloud.com/post/getmd4hash – user1097772 Dec 29 '16 at 14:42
- 
                    1According to user1097772’s link (and [Wikipedia](https://en.wikipedia.org/wiki/NT_LAN_Manager)), the NTLM hash is an MD4 hash, which is not in Java’s [list of standard algorithms](http://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#MessageDigest). You would have to implement the algorithm yourself. – VGR Dec 29 '16 at 14:55
2 Answers
3
            
            
        Type 3 NTLM response calculation implemented in Java is in the appendix D of The NTLM Authentication Protocol and Security Support Provider.
 
    
    
        markgamache
        
- 436
- 2
- 6
- 
                    For anyone having trouble accessing the URL: it was fine half an hour ago. I suspect Stack Overflow has given it more traffic than it was prepared to handle. – VGR Dec 30 '16 at 18:07
3
            I wrote this utility class:
import jcifs.smb.NtlmPasswordAuthentication;
/**
 * NTLM passwords encoding.
 * 
 * This implementation depends on the JCIFS library.
 */
public class NTLMPassword {
    private final static char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
    private NTLMPassword() {
        // No need to instantiate this class
    }
    /**
     * Return NTLM hash for a given string.
     * 
     * See https://lists.samba.org/archive/jcifs/2015-February/010258.html
     * 
     * @param value
     *            the string to hash.
     * @return the NTLM hash for the given string.
     */
    public static String encode(String value) {
        String s = (value != null) ? value : "";
        byte[] hash = NtlmPasswordAuthentication.nTOWFv1(s);
        return bytesToHex(hash).toUpperCase();
    }
    /**
     * See https://stackoverflow.com/a/9855338/1314986
     */
    private static String bytesToHex(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        for (int j = 0; j < bytes.length; j++) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = HEX_ARRAY[v >>> 4];
            hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
        }
        return new String(hexChars);
    }
}
This code uses the JCIFS library. If you use Maven, include the following dependency:
<dependency>
    <groupId>org.codelibs</groupId>
    <artifactId>jcifs</artifactId>
    <version>1.3.18.2</version>
</dependency>
You can validate this code with the following test:
@Test
public void testEncode() throws Exception {
    assertEquals("D36D0FC68CEDDAF7E180A6AE71096B35", NTLMPassword.encode("DummyPassword"));
}
 
    
    
        aaguilera
        
- 1,080
- 10
- 27
