Skip to content

Instantly share code, notes, and snippets.

@franks42
Last active December 14, 2015 10:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save franks42/5074268 to your computer and use it in GitHub Desktop.
Save franks42/5074268 to your computer and use it in GitHub Desktop.
Clojure repl-session to show usage of secure hash or message digest operations like SHA-1 and MD5 with the clj.security.message-digest library. See "https://github.com/franks42/clj.security.message-digest"
user=> (require '(clj.security [message-digest :as md]))
nil
user=> (def my-sha1-digest-0 (md/make-message-digest :sha-1 :utf-8)) ;; create a message digest object
#'user/my-sha1-digest-0
user=> my-sha1-digest-0
#<TMessageDigest clj.security.message_digest.TMessageDigest@66da7ad5>
user=> (md/digest my-sha1-digest-0) ;; sha-1 digest of an empty string - initial accumulator digest
#<byte[] [B@1cefd3c>
user=> (md/bytes2hex (md/digest my-sha1-digest-0)) ;; bytes are somewhat easier to "read" in hex
"DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"
user=> (def my-sha1-digest-abc (md/update my-sha1-digest-0 "abc")) ;; update accumulator with digest of "abc" as utf-8 charset
#'user/my-sha1-digest-abc
user=> (md/bytes2hex (md/digest my-sha1-digest-abc)) ;; sha-1 digest value of "abc"
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (md/digest (md/update my-sha1-digest-0 "abc"))) ;; md/update passes updated accumulator thru
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (md/digest (md/update (md/update my-sha1-digest-0 "a") "bc"))) ;; chaining multiple updates and digest
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (md/digest (md/update (md/update my-sha1-digest-0 "a") "b") "c")) ;; md/digest can also digest bytes/text
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (md/digest my-sha1-digest-0 "abc")) ;; don't need update when all can be passed in one go to digest
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (md/digest :sha-1 :utf-8 "abc")) ;; initial digest-message object gets transparently created
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (md/digest "abc")) ;; sha-1 and utf-8 are defaults
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (binding [md/*default-digest-algorithm* :SHA-1](md/digest "abc"))) ;; binding defaults is alternative
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (binding [md/*default-digest-algorithm* :MD5](md/digest "abc"))) ;; algo bound to md5
"900150983CD24FB0D6963F7D28E17F72"
user=> (md/bytes2hex (binding [md/*default-digest-algorithm* :MD5](md/digest :sha-256 "abc"))) ;; default is explicitly overwritten
"BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD"
user=> (md/bytes2hex (binding [md/*default-charset* :UTF-8](md/digest :sha-256 "abc"))) ;; set default for charset encoding
"BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD"
user=> (md/bytes2hex (binding [md/*default-charset* :UTF-16](md/digest :sha-256 "abc"))) ;; different charset gives different result
"2565AE43A9E12333FF5A9B4D38AFA39990F3FB63530EF0F616FC542471920405"
user=> (md/bytes2hex (binding [md/*default-charset* :UTF-16](md/digest :sha-256 :utf8 "abc"))) ;; again default explicitly overwritten
"BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD"
user=> (md/bytes2hex (md/digest (my-sha1-digest-0 "abc"))) ;; message-digest object as function: updater
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex ((my-sha1-digest-0 "abc"))) ;; message-digest object first updater then without argument: digester
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (my-sha1-digest-0)) ;; digester of initial sha-1 accumulator
"DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"
user=> (md/bytes2hex ((md/make-message-digest))) ;; just checking...
"DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"
user=> (md/bytes2hex ((md/make-message-digest :md5))) ;; digester of initial md5 accumulator
"D41D8CD98F00B204E9800998ECF8427E"
user=> (md/bytes2hex (((md/make-message-digest :md5) "abc"))) ;; md5 digester of "abc"
"900150983CD24FB0D6963F7D28E17F72"
user=> (md/bytes2hex (((md/make-message-digest :sha1) "abc"))) ;; sha-1 digester of "abc"
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (md/digest :sha1 "abc")) ;; back to where we started
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (md/digest :sha1 (.getBytes "abc" :UTF-8))) ;; accepts strings as well as bytes
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (md/digest :sha1 (.getBytes "abc" :UTF-16))) ;; different charset, different bytes
"216B288437984E5219858A80F511094CCD1A9681"
user=> (md/bytes2hex (md/digest :sha1 (.getBytes "a" :UTF-8) \b (byte 99))) ;; bytes, char and byte
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (md/digest :sha1 :utf8 "a" \b (byte 99))) ;; string, char and byte
"A9993E364706816ABA3E25717850C26C9CD0D89D"
user=> (md/bytes2hex (apply md/digest :sha1 (repeat 1000000 "a"))) ;; lazy digest of a million "a"s
"34AA973CD4C4DAA4F61EEB2BDBAD27316534016F"
user=>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment