【问题标题】:Why the Javascript did not encrypt my form?为什么 Javascript 没有加密我的表单?
【发布时间】:2015-08-30 13:02:09
【问题描述】:

Javascript RSA 库来自https://github.com/ziyan/javascript-rsa

PHP RSA 库来自http://phpseclib.sourceforge.net/

示例来自https://stackoverflow.com/a/10922491/5281854

我的代码(浏览器还是把原文发送到服务器):

<?php
include('Crypt/RSA.php');
session_start();
$rsa = new Crypt_RSA();
if(isset($_POST['password'])){
    echo $_POST['password'];
    echo 1;
    $rsa->loadKey($_SESSION['privatekey']);
    echo $rsa->decrypt($_POST['password']);
    exit();
}
extract($rsa->createKey(4096));

$_SESSION['privatekey']=$privatekey;
$publickey=str_replace("\n", "\\\n", $publickey);
?>
<!DOCTYPE html>
<html>
<head>
<script language="JavaScript" type="text/javascript" src="jsbn.js"></script>
<script language="JavaScript" type="text/javascript" src="rsa.js"></script>
<script language="JavaScript">

    function encryptData(){

        //Don't forget to escape the lines:
        var pem = "<?php echo $publickey; ?>";
        var key = RSA.getPublicKey(pem);
        element=document.getElementById('password');
        element.value=RSA.encrypt(element.value, key);
    }
</script>
</head>
<body>

<form method='POST' id='txtAuth' onsubmit='encryptData()'>
    <input type='text' name='username'/>
    <input type='password' name='password' id='password' placeholder="password"/>
    <input name='submit' type='submit' value='Submit'>
</form>
</body>
</html>

所有库文件均已正确加载。谁能告诉我为什么加密不起作用?

【问题讨论】:

  • 你有什么错误吗?
  • 其实没有。我使用了alert(),发现执行“RSA.encrypt(element.value, key)”时javascript停止了
  • 嗯.. 你确定公钥值编码正确吗?我看到 RSA 库希望它以特定格式放置。
  • key 后面的var key = RSA.getPublicKey(pem); 还是false?你能举一个PEM格式生成的公钥的例子吗?请edit你的问题包括缺失的信息。

标签: javascript php rsa phpseclib


【解决方案1】:

所以我在我自己的本地机器上尝试了你的代码并遇到了一些问题。

  1. 您正在执行 str_replace("\n", "\\\n", $publickey) - 我必须执行 str_replace("\r\n", "\\\n", $publickey) 否则我会在 javascript 控制台中收到 Uncaught SyntaxError: Unexpected token ILLEGAL 错误。

  2. 即使在完成 #1 之后,我仍然收到 Uncaught TypeError: this.toRadix is not a function 错误。我正在使用https://raw.githubusercontent.com/ziyan/javascript-rsa/master/src/jsbn.jshttps://raw.githubusercontent.com/ziyan/javascript-rsa/master/src/rsa.js,我根本没有真正修改过你的代码。亲自尝试一下:http://www.frostjedi.com/terra/so/

也就是说,看看你的 rsa.js……我仍然坚持我原来的说法,即假设 javascript 错误可以被克服,$rsa-&gt;setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 应该可以工作。不幸的是,由于我无法通过它们(而且我对修复三年未更新的一段代码不感兴趣)我无法验证。您自己是否真的有一个不会在 JS 控制台中产生错误的工作示例?

【讨论】:

  • Em... 这实际上不起作用。我试图复制示例(在顶部提到)而不更改它,它也不起作用。
  • @HowardLiu - 我的 javascript 出现语法和运行时错误,这使我无法测试它的 PHP 端。我编辑了我的答案以详细说明。
  • 谢谢。我发现了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 2014-04-08
  • 2012-08-25
  • 1970-01-01
  • 2019-03-21
相关资源
最近更新 更多