日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS关于提交的RSA加密算法

發布時間:2025/5/22 javascript 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS关于提交的RSA加密算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們平時做用戶登錄表單提交,用戶名密碼都是明文直接POST到后端,這樣很容易被別人從監聽到。

?

注:包括使用MD5等哈希函數處理后的數據,這里也算做明文(現在MD5爆破網站已經很多了~)。

?

對安全性要求較高的網站,比如銀行和大型企業等都會使用HTTPS對其進行加密通訊。

?

但是由于效率原因,使用HTTPS的代價是及其昂貴的,對于訪問量稍大的網站就會造成嚴重的性能瓶頸。解決方法一般只能采用專門的SSL硬件加速設備如F5的BIGIP等。

?

所以很多網站選擇了模擬SSL的做法,使用RSA來對密碼等安全信息進行公鑰加密,服務端用私鑰解密。

?

通常是對密碼進行加密,本文也拿密碼加密為例。

?

網上相關信息太少,折騰了幾天,終于有眉目了,先貼代碼,關鍵部分后面說明。

?

首先加載三個RSA的js庫文件,可以到這里下載 http://www.ohdave.com/rsa/

?

javascript部分代碼(with jQuery)

?

view plaincopy to clipboardprint?

$(document).ready(function(){ ?

//十六進制公鑰 ?

var rsa_n = "C34E069415AC02FC4EA5F45779B7568506713E9210789D527BB89EE462662A1D0E94285E1A764F111D553ADD7C65673161E69298A8BE2212DF8016787E2F4859CD599516880D79EE5130FC5F8B7F69476938557CD3B8A79A612F1DDACCADAA5B6953ECC4716091E7C5E9F045B28004D33548EC89ED5C6B2C64D6C3697C5B9DD3"; ?

??????

$("#submit").click(function(){ ?

????setMaxDigits(131); //131 => n的十六進制位數/2+3 ?

????var key ?????= new RSAKeyPair("10001", '', rsa_n); //10001 => e的十六進制 ?

????var password = $("#password").val(); ?

????password = encryptedString(key, password); //不支持漢字 ?

????$("#password").val(password); ?

????$("#login").submit(); ?

????alert(password); //test ?

}); ?

}); ?

?

PHP部分代碼

?

view plaincopy to clipboardprint?

?

function publickey_encodeing($sourcestr, $fileName) ?

{ ?

????$key_content = file_get_contents($fileName); ?

????$pubkeyid ???= openssl_get_publickey($key_content); ?

??????

????if (openssl_public_encrypt($sourcestr, $crypttext, $pubkeyid)) ?

????{ ?

????????return base64_encode("".$crypttext); ?

????} ?

} ?

?

function privatekey_decodeing($crypttext, $fileName, $fromjs = FALSE) ?

{ ?

????$key_content = file_get_contents($fileName); ?

????$prikeyid ???= openssl_get_privatekey($key_content); ?

????$crypttext ??= base64_decode($crypttext); ?

????$padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING; ?

????if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, $padding)) ?

????{ ?

????????return $fromjs ? rtrim(strrev($sourcestr), "\0") : "".$sourcestr; ?

????} ?

????return ; ?

} ?

//JS->PHP 測試 ?

$txt_en = $_POST['password']; ?

$txt_en = base64_encode(pack("H*", $txt_en)); ?

$file = 'ssl/server.pem'; ?

$txt_de = privatekey_decodeing($txt_en, $file, TRUE); ?

var_dump($txt_de); ?

//PHP->PHP 測試 ?

$data = "漢字:1a2b3c"; ?

$config = Core::getInstance()->config; ?

$file1 = 'ssl/server.crt'; ?

$file2 = 'ssl/server.pem'; ?

$a = publickey_encodeing($data, $file1); ?

$b = privatekey_decodeing($a, $file2); ?

var_dump($b); ?

?

其中密鑰的獲取是關鍵(其他難點已經被從代碼中解決)

?

由于密鑰從x.509證書中獲取,所以要先生成密鑰及證書文件(本文中用的1024位密鑰),具體生成方法可以參考我之前的那篇《Nginx下配置HTTPS(SSL)安全站點》

?

這里重點說一下怎么獲取十六進制的密鑰。

?

從文件中讀取密鑰之前嘗試了很多方式,無論怎么都無法提取正確的十六進制密鑰。網上查了發現數據是用ASN.1編碼過的……汗~

?

最后無意中注意到linux下用openssl命令貌似可以從密鑰文件(key或pem)提取。方式如下:

?

openssl asn1parse -out temp.ans -i -inform PEM < server.pem

?

顯示結果如下:

?

?

?

從這里可以看到最終的16進制密鑰。

?

個人感覺這種方法并不算模擬HTTPS,只是利用其用到的RSA非對稱加密算法實現小數據量安全加密。若要較完全的模擬SSL通信,就需要用RSA對另一密鑰加密,然后通過一系列握手流程再進行對稱加密。

?

PHP中openssl擴展公私鑰加密函數只支持小數據,加密時117字節,解密時128字節。若不然得自己循環加密后合并。

?

SSL本身也只是用RSA來進行密鑰加密,數據加密則是利用這個加密的密鑰進行對稱加密,以保證速度。所以萬不可將其用于大數據量加密!

?

最后總結下本方案幾處優點:

?

1、安全性高?;诜菍ΨQ的RSA算法加密數據,只要在私鑰不被暴露的前提下,密鑰長度足夠長,短時間內基本是無法破解的。

?

2、使用方便。前端使用現成的JS庫來實現加密,PHP端則可直接使用現成的openssl擴展,而不用RSA的PHP源碼實現或自己開發擴展。

?

3、速度靠譜。由于RSA解密算法相當復雜,而該操作交由PHP端擴展來實現,效率上比網上的PHP代碼要高許多。

?

4、便于升級。密鑰是直接從linux下openssl工具生成的證書中獲取,不僅不用其他密鑰生成工具,也方便今后升級到真正的HTTPS。

總結

以上是生活随笔為你收集整理的JS关于提交的RSA加密算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。