anchor.diff:  .Example using kdf1 or kdf2
   [source, clojure]
   ----
  -(require '[buddy.core.codecs :refer :all])
  +(require '[buddy.core.codecs :as codecs])
   (require '[buddy.core.kdf :as kdf])
   
   ;; kdf1 and kdf2 are very similar and have the same
   ;; constructor signature. Requires: key data, salt
   ;; and hash algorithm keyword.
   
  -(let [kfn (kdf/kdf2 (str->bytes "mysecretkey") (str->bytes "mypublicsalt") :sha256)]
  -  (-> (kdf/generate-bytes! kfn 8)
  -      (bytes->hex)))
  +(let [kfn (kdf/kdf2 (codecs/str->bytes "mysecretkey")
  +                    (codecs/str->bytes "mypublicsalt")
  +                    :sha256)]
  +  (-> (kdf/generate-byte-array! kfn 8)
  +      (codecs/bytes->hex)))
  +
   ;; => "0faba553152fce4f"
   ----
   
  
positive.code: 
  ;; Generate hmac for file
  (-> (io/input-stream "/tmp/somefile")
      (hmac/hmac "mysecretkey" :sha256)
      (bytes->hex))
  ;; -> "4cb793e600848da2053238003fce4c010233c49df3e6a04119b4287eb464c27e"
  ----
  
  You can extend it for your own types using `buddy.core.mac.hmac/HMac` protocol:
  
  [source,clojure]
  ----
  (defprotocol HMac
    (make-hmac [data key algorithm]))
  ----
  
  
  
negative.code: .Make mac using Serpent block cipher with random IV
  [source, clojure]
  ----
  (require '[buddy.core.codecs :as codecs])
  (require '[buddy.core.mac.poly1305 :as poly])
  (require '[buddy.core.nonce :as nonce])
  
  (let [sig (poly/hash "some-data" "mysecret" :serpent)]
    (codecs/bytes->hex sig))
  ;; => "1976b1c490c306e7304a59dfacee4207"
  ----
  
  
  == Public/Private keypairs
  
  