How can you create an md5 hash for a string on a mac using bash? md5sum does not exist in my environment. I did a man for md5 but I'm confused about what that really does.
md5 "string"
does not return a hash.
This should work -
[jaypal:~/Temp] echo "this will be hashed" | md5
2caf9daf910b5ef86796f74c20b7e0b
or if you prefer here string notation then -
[jaypal:~/Temp] md5 <<< 'this will be hashed'
55be2dc2df2c1cc7bad72a0ecb338841
Per the man page, you can play around with any of the following options
[jaypal:~/Temp] man md5
MD5(1) General Commands Manual MD5(1)
...
NAME
md5 – calculate a message-digest fingerprint (checksum) for a file
-s string
Print a checksum of the given string.
-p Echo stdin to stdout and append the checksum to stdout.
-q Quiet mode - only the checksum is printed out. Overrides the -r option.
...
[jaypal:~/Temp] md5 -s 'this will be encrypted'
MD5 ("this will be encrypted") = 502810f799de274ff7840a1549cd028a
[jaypal:~/Temp] md5 -qs 'this will be encrypted'
502810f799de274ff7840a1549cd028a
Note: MD5 always produces the same hash. The reason you find the output different from the example given above is due to a point that has been made in the comments. The first two examples use the trailing newline character to produce the hash. To avoid that, you can use:
[jaypal:~/Temp] echo -n "this will be encrypted" | md5
502810f799de274ff7840a1549cd028a
For example, if you use echo -n "string" | md5 (note the -n option), you get b45cffe084dd3d20d928bee85e7b0f21. But, if you use echo "string" | md5, you get b80fa55b1234f1935cea559d9efbc39a.
Or, verify it with the shell:
➜ [jaypal:~/Temp] [ $(echo "HOLA" | md5) = $(echo "HOLA" -n | md5) ]; echo "$?"
1
# 1 -> False. Hence, the result from echoing "HOLA" toggling the -n flag
# outputs different md5 checksums.
this will be *hashed*, encryption denotes bi-directional ;)502810f799de274ff7840a1549cd028a, which you can get via echo -n "this will be encrypted" | md5.echo -n isn't very portable -- on some platforms, it adds "-n " in front of the string to be printed (and then adds the newline as well). Use printf "%s" "this will be encrypted" | md5 for much better portability.To achieve what you asked:
md5 -s string
outputs: MD5 ("string") = b45cffe084dd3d20d928bee85e7b0f21
OSX uses md5 but most unices use md5sum
Here is a section of rvm's rvmrc validation code which finds the correct md5 binary and wraps it.
__rvm_md5_for()
{
if builtin command -v md5 > /dev/null; then
echo "$1" | md5
elif builtin command -v md5sum > /dev/null ; then
echo "$1" | md5sum | awk '{print $1}'
else
rvm_error "Neither md5 nor md5sum were found in the PATH"
return 1
fi
return 0
}
( Code from https://github.com/wayneeseguin/rvm/blob/master/scripts/functions/rvmrc )
The correct way of doing that would be echo -n string | md5 instead of echo "string" | md5. (I am using zsh)
Convert the md5 hash given by echo -n string | md5 you will get back string.
md5 -s string also works which is already pointed out here.
λ [~] → echo "string" | md5
b80fa55b1234f1935cea559d9efbc39a
λ [~] → echo -n string | md5
b45cffe084dd3d20d928bee85e7b0f21
λ [~] → md5 -s string
MD5 ("string") = b45cffe084dd3d20d928bee85e7b0f21
All the other answers are valid. I would like to also propose openssl as well:
➜ echo 'this will be hashed' | openssl md5
55be2dc2df2c1cc7bad72a0ecb338841
which is equivalent to the following
➜ echo 'this will be hashed' | openssl dgst -md5
# or
➜ openssl md5 <<< 'this will be hashed'
# or
➜ echo 'this will be hashed' | md5
From the command line:
md5 <<< "String to hash"
8a0a39505c5753ff64a0377ab0265509
md5 -s "String to hash" because by default, bash adds newlines to the end of here stringsYou may want to use some randomness here, otherwise the password will always be the same. This should work:
dd if=/dev/random count=20|md5