セキュリティに関する具体的なニーズがあります。これは、私が快適である以上のセキュリティ関連コードを作成していることを意味します。私がやっていることがどこかの図書館で解決されたら、私に知らせてください。私はすぐに実装を中止します。私のセキュリティデザインは鳴っていますか?
Java(実際にはClojure)で書かれたサーバとJavaScript(実際にはClojureScript)で書かれたクライアントがElectronアプリケーションとして実行されています。これまでサーバーから情報にアクセスできるようにするために、様々なクライアントアプリケーションが必要です。暗号化を終了する必要があります。
エンドツーエンドの暗号化を実装するには、クライアントでプライベート公開鍵ペアを生成してから公開鍵と秘密鍵の暗号化バージョンをサーバーにアップロードする必要があります。次に、クライアントがランダムなデータに署名し、サーバーがそれを検証するような一種のチャレンジ応答を実行することによって、サーバーはユーザーを認証します。
登録プロセスは、次に、具体的には、楕円曲線のDiffie Hellman鍵ペアを生成する16バイトの塩を生成する、ことを生成した後https://security.stackexchange.com/questions/78621/which-elliptic-curve-should-i-use
に係る良い選択であると思わP-521(secp521r1)と含みます私はその塩を使ってパスワードを872791回pbkdf2、keylenを32、sha512を使用しています。ハッシュされたキーを使用して私は秘密鍵をaes-256-ctrで暗号化します。最後のステップは、塩の長さ、塩、および暗号化された秘密鍵を連結し、サーバーに送信することです。
私は、このすべてがTLSセキュリティで保護されたHTTPSを介して行われると仮定しています.HTTPSでは、サーバーの証明書の有効性が通常の方法でCAによって検証されます。将来、私はセキュリティを強化するために証明書のピン設定を使用するかもしれません。
これは健全なデザインですか?それは安全に見えますか?このうちのどれか、またはすべてが、私が維持管理している第三者のオープンソースライブラリに委任できただけですか?
私の実際のコード:
(def elliptic-curve-name "secp521r1") ; https://security.stackexchange.com/questions/78621/which-elliptic-curve-should-i-use
(def encryption-algorithm "aes-256-ctr") ; http://lollyrock.com/articles/nodejs-encryption/
(def hash-bytes 32)
(def salt-bytes 16)
(def pbkdf-digest "sha512")
(def iterations 872791)
(defn encrypt-text [text key]
(let [salt (.randomBytes crypto salt-bytes)
salt-string (.toString salt "base64")
hashed-password (.pbkdf2Sync crypto key salt iterations hash-bytes pbkdf-digest)
text-cipher (.createCipher crypto encryption-algorithm hashed-password)
encrypted-text (gstring/format "%04d%s%s%s"
(count salt-string)
salt-string
(.update text-cipher text "utf8" "hex")
(.final text-cipher "hex"))]
encrypted-text))
(defn decrypt-text [encrypted-text key]
(let [salt-length (js/parseInt (subs encrypted-text 0 4) 10)
salt (.from js/Buffer (subs encrypted-text 4 (+ salt-length 4)) "base64")
hashed-key (.pbkdf2Sync crypto key salt iterations hash-bytes pbkdf-digest)
encrypted-text (subs encrypted-text (+ salt-length 4))
text-decipher (.createDecipher crypto encryption-algorithm hashed-key)]
(str (.update text-decipher encrypted-text "hex" "utf8")
(.final text-decipher "utf8"))))
(defn generate-key-pair [password]
(let [diff-hell (.createECDH crypto elliptic-curve-name)
public-key (.generateKeys diff-hell "base64")
private-key (.getPrivateKey diff-hell "base64")
encrypted-private-key (encrypt-text private-key password)]
[public-key private-key encrypted-private-key]))
私はこれは話題ではないと言っているわけではありませんが、あなたがここで不満足な答えを見つけたら、InformationSecurityはあなたに良い答えを与えるかもしれません。 –
このマニュアルの暗号化を心配する理由は?強力な暗号でTLSを使用し、認証にクライアント証明書を使用するだけではどうですか? – mscdex
彼はそれがサーバーに保存されている間、 "休憩中のデータ"のプライバシーについて尋ねています。 TLSは「転送中のデータ」を保護します –