在JavaScript中加密字符串并使用RSA技术在PHP中解密

我正在尝试加密JavaScript中的一些文本,然后将其发送到PHP(等等:使用Ajax)来解密它 在那里保存它(等等:在MySQL中)。</ p>

到目前为止,这是我的代码:</ p>

在JavaScript中</ strong> </ p>

我正在使用此库进行加密:
http://travistidwell.com/blog/2013/02/15/a-better-library-for-javascript-asymmetrical-rsa-encryption/ </ a> </ p>

  function ConvertToURL(data){
//将数据转换为URL友好形式
//等:替换'+','/','=' 使用'plus','slash','equal'
};

函数AjaxOrder(data){
//使用Ajax发送PHP中的数据
}

var publicKey ='----- BEGIN PUBLIC KEY -----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN
FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr / L5i2osbl8C9 + WJTeucF + S76
xFxdU6jE0NQ + Z + zEdhUTooNRaY5nZiu5PgDB0ED / Z KBUSLKL7eibMxZtMlUDHjm4
gwQco1KRMDSmXSMkDwIDAQAB
----- END PUBLIC KEY -----';

var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
var encrypted = encrypt.encrypt('Text to 发送。');

  • //现在我发送带有一些Ajax函数的加密文本*

AjaxOrder(ConvertToURL(加密));
</ code> </ pre>

在PHP中:</ strong> </ p>

  $ dataPost = $ _POST('dt'); 

function ConvertFromURL($ data){
//将$ data转换为原始形式
// etc:将'plus','slash','equal'替换为'+','/','='
}
函数返回数据($ data){\ n //在JavaScript中发送$ data作为Ajax的答案

$ n privateKey ='----- BEGIN RSA私钥-----
MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
WMNW649887VGJiGr / L5i2osbl8C9 + WJTeucF + S76xFxdU6jE0NQ + Z + zEdhUTooNR
aY5nZiu5PgDB0ED / ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc / Z2hfenfYEzu + 57fI4fv
xTQ // 5DbzRR / XKb8ulNv6 + CHyPF31xk7YOBfkGI8qjLoq06V + FyBfDSwL8KbLyeH
m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN + N9dECQQD0ONYRNZeuM8zd
8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu + cdrQeaqEixrCejXdAF \ NZ / 7 + BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0 / mPwmP5
rN7QwjrMY + 0 + + AbXcm8mRQyQ1 IGEembsdwJBAN6az8Rv7QnD / YBvi52POIlRSSIM
V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe
aTgjFnqE / lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil
psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU / YgDnSpJVm1nASoRUnU8Jfm3Oz
uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
----- END RSA私钥 -----';

openssl_private_decrypt(ConvertFromURL($ dataPost),$ decryptedWord,$ privateKey);

ReturnData(base64_encode($ decryptedWord));
</ code> </ pre>
\ n

现在PHP的答案每次都是空的。 有什么想法让这个有用吗?</ p>

感谢您的时间!</ p>
</ div>

展开原文

原文

I am trying to encrypt some text in JavaScript and then send it to PHP (etc: with Ajax) to decrypt it there and save it (etc: In MySQL).

Here is my code so far:

In JavaScript:

I am using this library for the encryption: http://travistidwell.com/blog/2013/02/15/a-better-library-for-javascript-asymmetrical-rsa-encryption/

function ConvertToURL(data) {
    // Converts data to URL friendly form
    // etc: Replaces '+', '/', '=' with 'plus', 'slash', 'equal'
};
function AjaxOrder(data) {
    // Sends data in PHP with Ajax
}

var publicKey = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN
FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76
xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4
gwQco1KRMDSmXSMkDwIDAQAB
-----END PUBLIC KEY-----';

var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
var encrypted = encrypt.encrypt('Text to send.');

*// And now I am sending the encrypted text with some Ajax function*

AjaxOrder(ConvertToURL(encrypted));

In PHP:

$dataPost = $_POST('dt');

function ConvertFromURL($data) {
    // Converts $data to original form
    // etc: Replaces 'plus', 'slash', 'equal' with '+', '/', '='
}
function ReturnData($data) {
    // Sends $data back in JavaScript as an answer to Ajax
}

$privateKey = '-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR
aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv
xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH
m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd
8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF
z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5
rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM
V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe
aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil
psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz
uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
-----END RSA PRIVATE KEY-----';

openssl_private_decrypt(ConvertFromURL($dataPost), $decryptedWord, $privateKey);

ReturnData(base64_encode($decryptedWord));

Now the answer from PHP is empty every time. Any ideas to make this work?

Thank you for your time!

drurhg37071
drurhg37071 如果您想知道必须使用SSL的原因,请参阅此文章:matasano.com/articles/javascript-cryptography
6 年多之前 回复
duanmen2189
duanmen2189 不要发明自己的系统。使用SSL。它更便宜,更快,更安全,更简单。您的提案没有任何好处。
6 年多之前 回复
duanfei9278
duanfei9278 阿德南没有理由这样说话。如果你发现这个不合理的话就别烦了。不管怎么说,还是要谢谢你
6 年多之前 回复
dongwenxiu5200
dongwenxiu5200 你真的听到了吗?因为我已经提到过SSL。
6 年多之前 回复
dtd5644
dtd5644 没有安全连接。我试图通过互联网保护传输的数据,这种方式对我来说更容易理解。如果你有更安全或更简单的方式我听到..:)
6 年多之前 回复
dongyi7901
dongyi7901 穷人的SSL......实际上是SSL,因为它比你想做的事情更省时。
6 年多之前 回复
dongzexi5125
dongzexi5125 只是好奇-这有什么好处?如果你是一个安全的连接,窥探是不可能的。如果您使用的是不安全的连接,那么绝对不能保证您运行的是正确的JavaScript。
6 年多之前 回复

1个回答



使用HTTPS。</ p>

您正在做的事情永远无法保护您免受主动攻击 (MitM),因为你没有任何信任锚,并且非常</ strong>可能你会犯一些使其不安全的愚蠢错误。</ p>

要么 因此,您无法使用RSA直接加密超过几百个字节。 因此,您必须安全地</ em>生成随机对称密钥(在JavaScript中正确执行此操作并不容易),使用安全分组密码模式中的安全对称密码(例如AES)对数据进行加密 ,然后使用RSA加密对称密钥。 学习如何“正确”地完成它将比真正</ em>正确地做 </ em>更多时间,即配置SSL。</ p>
</ div >

展开原文

原文

Use HTTPS.

What you are doing will never be able to protect you against active attacks (MitM) since you don't have any trust anchors, and it is very likely that you will make some stupid mistake that will make it insecure.

Either way, you cannot encrypt more than a few hundred bytes directly with RSA. Thus, you will have to securely generate a random symmetric key (doing that properly in JavaScript is not easy), encrypt the data with it using a secure symmetric cipher (e.g. AES) in a secure block cipher mode, then encrypt the symmetric key with RSA. Learning how to do it "properly" will take you much more time than really doing it properly, and that is, configuring SSL.

doupian9798
doupian9798 如果您担心使用SSL加载,请注意一个重要注意事项 - 使用2048位密钥。 (不允许更短,更长时间会显着增加负载。)
6 年多之前 回复
duangu6588
duangu6588 好的,谢谢,我会去SSL!
6 年多之前 回复
dongnuo4594
dongnuo4594 要使页面安全,您需要以可信的方式加载每一个JS(包括可能包含脚本的HTML)。 唯一的方法(我知道/可以想象)这样做是使用SSL。
6 年多之前 回复
doupu1957
doupu1957 SSL的主要负载来自必须执行的私钥操作。 SSL每个连接建立最多执行一次,由于HTTP保持活动,连接被重用于多个HTTP请求,并且由于SSL会话处理,可以在多个连接上重用相同的SSL会话。 如果您打算为用户读取的每个页面调用一次openssl_private_decrypt,它可能比SSL更昂贵(按负载方式)。 顺便说一句,SSL不会造成太大负担。 我的旧笔记本电脑的单核可以每秒处理100次SSL握手。
6 年多之前 回复
dongrou839975
dongrou839975 你的答案很有说服力,但我试图这样做的原因是对我的站点请求到服务器的安全性最低(这是很多!)。 我认为SSL对于我期待的流量来说有点沉重。 没有随机密钥,有没有办法做到这一点? 或者至少比SSL快一些其他方法?
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐