Skip to content

Instantly share code, notes, and snippets.

@jhickner
Created April 14, 2012 07:00
Show Gist options
  • Save jhickner/2382543 to your computer and use it in GitHub Desktop.
Save jhickner/2382543 to your computer and use it in GitHub Desktop.
hmac
(ns oauth.digest
(:import (javax.crypto Mac)
(javax.crypto.spec SecretKeySpec)))
(defn hmac
"Calculate HMAC signature for given data."
[^String key ^String data]
(let [hmac-sha1 "HmacSHA1"
signing-key (SecretKeySpec. (.getBytes key) hmac-sha1)
mac (doto (Mac/getInstance hmac-sha1) (.init signing-key))]
(String. (org.apache.commons.codec.binary.Base64/encodeBase64
(.doFinal mac (.getBytes data)))
"UTF-8")))
(defn hmac-sha-256
[key-seq byte-seq]
(let [hmac-key (SecretKeySpec. (byte-array key-seq) "HmacSHA256")
hmac (doto (Mac/getInstance "HmacSHA256") (.init hmac-key))]
(.doFinal hmac (byte-array byte-seq))))
(ns compojure.crypto
"Functions for cryptographically signing, verifying and encrypting data."
(:use compojure.encodings)
(:use clojure.contrib.def)
(:use clojure.contrib.java-utils)
(:import java.security.SecureRandom)
(:import javax.crypto.Cipher)
(:import javax.crypto.KeyGenerator)
(:import javax.crypto.Mac)
(:import javax.crypto.spec.SecretKeySpec)
(:import javax.crypto.spec.IvParameterSpec)
(:import java.util.UUID))
(defvar hmac-defaults
{:algorithm "HmacSHA256"}
"Default options for HMACs.")
(defvar encrypt-defaults
{:algorithm "AES"
:key-size 128
:mode "CBC"
:padding "PKCS5Padding"}
"Default options for symmetric encryption.")
(defn- make-algorithm
"Return an algorithm string suitable for JCE from a map of options."
[options]
(str "AES/" (options :mode) "/" (options :padding)))
(defn- make-cipher
"Create an AES Cipher instance."
[options]
(Cipher/getInstance (make-algorithm options)))
(defn decrypt-bytes
"Decrypts a byte array with the given key and encryption options."
[options key data]
(let [options (merge encrypt-defaults options)
cipher (make-cipher options)
[iv data] (split-at (.getBlockSize cipher) data)
iv-spec (IvParameterSpec. (to-bytes iv))
secret-key (SecretKeySpec. key (options :algorithm))]
(.init cipher Cipher/DECRYPT_MODE secret-key iv-spec)
(.doFinal cipher (to-bytes data))))
(defn decrypt
"Base64 encodes and encrypts a string with the given key and algorithm."
[options key data]
(String. (decrypt-bytes options key (base64-decode-bytes data))))
@spacegangster
Copy link

spacegangster commented Feb 3, 2020

if someone will need a PHP-like version – take this
Different algo and will output hex, instead of UTF-8 formatted string

(defn hmac
  "Calculate HMAC signature for given data."
  [^String key ^String data]
  (let [algo "HmacSHA256"
        signing-key (SecretKeySpec. (.getBytes key) algo)
        mac (doto (Mac/getInstance algo) (.init signing-key))]
    (format "%x" (BigInteger. (.doFinal mac (.getBytes data))))))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment