erlang 使用rsa加密及解密
阿新 • • 發佈:2018-12-12
rsa是非對稱加密演算法,有公開祕鑰(publickey)和私有金鑰(privatekey),如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。在使用者賬號登入這塊就防止密碼洩露,除非祕鑰洩露。
在erlang使用rsa主要需要public_key模組,所有需要引入相關標頭檔案。
-include_lib("public_key/include/public_key.hrl").
生成公鑰祕鑰
讓客戶端每次登陸時都請求服務端生成新的公鑰祕鑰,也把生成結果放在socketpid的程序字典裡,斷開socket相當於重置。
set_private_key() -> %%獲取私鑰 #'RSAPrivateKey'{modulus=Modulus, publicExponent=PublicExponent} = PrivateKey = public_key:generate_key({rsa, 1024, 65537}), %%獲取公鑰 PublicKey = #'RSAPublicKey'{modulus=Modulus, publicExponent=PublicExponent}, put(rsa_private_key, PrivateKey), put(rsa_public_key, PublicKey), {PrivateKey, PublicKey}.
注意1024是金鑰長度,目前主流可選值:1024、2048、3072、4096...低於1024bit的金鑰已經不建議使用(安全問題)。65537是公鑰指數,是隨意選的質素,但目前行業上公鑰指數普遍選的都是65537
RSA加密
en_rsa(BinData) ->
%%公鑰加密
PublicKey = get(rsa_public_key),
Cipher = public_key:encrypt_public(BinData, PublicKey),
Cipher.
RSA解密
de_rsa(BinData) -> PrivateKey = get(rsa_private_key), %%私鑰解密 Result = public_key:decrypt_private(BinData, PrivateKey), Result.
公鑰轉視覺化字元
由於生成的公鑰是erlang Record的結構,客戶端無法識別,所以需要轉化
%%公鑰轉字串
key_to_list(PublicKey) ->
binary_to_list(public_key:pem_encode([public_key:pem_entry_encode('SubjectPublicKeyInfo',PublicKey)])).