Clojure是否有一個簡單的文本加密器,只需要一個密碼來解密?我只是希望像加密:Clojure有一個簡單的文本加密器,只需要一個密碼解密?
(encrypt "Some secret message" "Some secret key")
:和解密:
(decrypt (encrypt "Some secret message" "Some secret key") "Some secret key")
:將返回:
"Some secret message"
Clojure是否有一個簡單的文本加密器,只需要一個密碼來解密?我只是希望像加密:Clojure有一個簡單的文本加密器,只需要一個密碼解密?
(encrypt "Some secret message" "Some secret key")
:和解密:
(decrypt (encrypt "Some secret message" "Some secret key") "Some secret key")
:將返回:
"Some secret message"
[org.clojars.tnoda/simple-crypto "0.1.0"]
它做的正是你想要的東西:
user=> (use 'org.clojars.tnoda.simple-crypto)
user=> (decrypt (encrypt "Some secret message" "Some secret key!") "Some secret key!")
"Some secret message"
我不知道是做任何的Clojure庫大多數 - 我會說 - 因爲它太容易使用javax.crypto,javax.crypto.spec和java.security包。
可以在30行內完成。
我決定這個功能對我正在開發的一個項目很有幫助。
除了標準clojure,它還需要commons-codec。
project.clj
:
(defproject <project> "VERSION"
...
:dependencies [[org.clojure/clojure "1.5.1"]
[commons-codec "1.8"]])
<project>/src/crypt.clj
:
(ns <whatever>.crypt
(:import (javax.crypto KeyGenerator SecretKey Cipher SecretKeyFactory)
(javax.crypto.spec SecretKeySpec PBEKeySpec)
(org.apache.commons.codec.binary Base64)))
(def ^:dynamic *salt* "BIND SALT IN APP")
(defn cipher- [] (. Cipher getInstance "AES"))
(defn aes-keyspec [rawkey] (new SecretKeySpec rawkey "AES"))
(defn encrypt-
[rawkey plaintext]
(let [cipher (cipher-)
mode (. Cipher ENCRYPT_MODE)]
(. cipher init mode (aes-keyspec rawkey))
(. cipher doFinal (. plaintext getBytes))))
(defn decrypt-
[rawkey ciphertext]
(let [cipher (cipher-)
mode (. Cipher DECRYPT_MODE)]
(. cipher init mode (aes-keyspec rawkey))
(new String(. cipher doFinal ciphertext))))
(defn passkey
[password & [iterations size]]
(let [keymaker (SecretKeyFactory/getInstance "PBKDF2WithHmacSHA1")
pass (.toCharArray password)
salt (.getBytes *salt*)
iterations (or iterations 1000)
size (or size 128)
keyspec (PBEKeySpec. pass salt iterations size)]
(-> keymaker (.generateSecret keyspec) .getEncoded)))
(defn encrypt
[password plaintext]
(encrypt- (passkey password) plaintext))
(defn decrypt
[password cyphertext]
(decrypt- (passkey password) cyphertext))
用法:
(binding [crypt/*salt* "THE SALT WE ARE USING"]
(crypt/encrypt "password" "message")
(crypt/decrypt "password" *1)))
如果你可以使用生成的密鑰,那將是更安全:
(defn aes-keygen [] (. KeyGenerator getInstance "AES"))
(defn genkey
[keygen]
(. keygen init 128)
(. (. keygen generateKey) getEncoded))
(def generated (keygen aes-keygen))
(encrypt- generated plaintext)
(decrypt- generated *1)
這只是使用隨jvm提供的vanilla安全功能(commons-codec僅用於base-64編碼/解碼,因此我們可以對任意輸入進行操作,而不是安全設置的一部分)。
我認爲你的答案就在這裏:http://stackoverflow.com/questions/10221257/is-there- AN-AES-庫換的Clojure – noisesmith