在Javascript中加密,在PHP中解密,使用公钥加密

2022-08-30 12:01:38

我想用JavaScript加密,用PHP解密,使用公钥加密。我一直在努力寻找可以实现这一目标的库,但是遇到了问题。

我目前正在查看openpgpjs,但我需要所有浏览器的支持,甚至测试页面在唯一列为受支持浏览器(Google Chrome)上都有错误。

关于最终目标的注意事项:

TCP 连接已受 SSL 保护。此保护层的主要目的是防止有意或无意的Web服务器日志记录,故障转储等。

在PHP端,将生成一个临时私钥(它将在短时间内过期)。调用方(在 Javascript 中)负责在过期时请求新的公钥。私钥过期的原因是防止记录的加密数据解密,以防存储私钥的服务器以后受到损害。

服务器受损场景:有人获得了除数据库服务器之外所有计算机的备份(并且由于防火墙而无法访问数据库,即使他发现了用户和密码)。由于加密记录数据的私钥不再存在,因此攻击者无能为力。


答案 1

我在登录页面中使用了类似的东西;它使用给定的公钥信息(N,e)加密登录凭据,这些信息可以在PHP中解密。

它使用以下属于 JSBN 的文件:

  • jsbn.js- 处理大整数
  • rsa.js- 仅用于 RSA 加密(使用 jsbn.js)
  • rng.js- 基本熵收集器
  • prng4.js- ARC4 RNG 后端

要加密数据:

$pk = '-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----';
$kh = openssl_pkey_get_private($pk);
$details = openssl_pkey_get_details($kh);

function to_hex($data)
{
    return strtoupper(bin2hex($data));
}

?>
<script>
var rsa = new RSAKey();
rsa.setPublic('<?php echo to_hex($details['rsa']['n']) ?>', '<?php echo to_hex($details['rsa']['e']) ?>');

// encrypt using RSA
var data = rsa.encrypt('hello world');
</script>

以下是解码已发送数据的方法:

$kh = openssl_pkey_get_private($pk);
$details = openssl_pkey_get_details($kh);
// convert data from hexadecimal notation
$data = pack('H*', $data);
if (openssl_private_decrypt($data, $r, $kh)) {
   echo $r;
}

答案 2

签出 node-rsa

它是一个节点.js模块

此模块提供对来自 OpenSSL 的 RSA 公钥例程的访问。支持仅限于 RSAES-OAEP 和使用公钥进行加密,使用私钥进行解密。

也许您可以将其移植到浏览器中运行。

更新

用于javascript的RSA客户端库:(pidcrypt已正式停产,网站域已过期 - 请参阅@jack的答案,其中包含与pidcrypt相同的库)https://www.pidder.com/pidcrypt/?page=rsa

PHP 服务器端组件:http://phpseclib.sourceforge.net/

祝你好运!