Nodejs 使用node-rsa 加密数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nodejs 使用node-rsa 加密数据相关的知识,希望对你有一定的参考价值。

参考技术A RSA算法原理 阮一峰

1、在node.js中使用rsa算法。首先需要是使用node-rsa包

2、实现加密/解密

客户端需要使用一个jsencrypt.min.js 包利用公钥对数据进行加密

以上运行时可以会出现如下错误

出现如上错误的时候,是服务端的加密方法和jsencrypt的加密方式不一致导致的。jsencrypt加密方式是pkcs1,node-rsa 默认的加密方式是pkcs1_oaep。解决办法如下:

Android RSA 和 node.js RSA 加密/解密

【中文标题】Android RSA 和 node.js RSA 加密/解密【英文标题】:Android RSA and node.js RSA Encryption/Decryption 【发布时间】:2015-02-27 14:31:51 【问题描述】:

我目前在我的服务器上解密 RSA 加密数据时遇到问题,该服务器正在使用 node.js 并使用 node-rsa 库进行加密/解密。

在我的 Android 客户端上接收到的公钥没有任何问题,但是在尝试解密数据时出现以下异常:

TypeError: Cannot call method 'toString' of null
    at NodeRSA.module.exports.NodeRSA.$getDecryptedData (C:\src\qteddev\node\nod
e_modules\node-rsa\src\NodeRSA.js:283:27)
    at NodeRSA.module.exports.NodeRSA.decrypt (C:\src\qteddev\node\node_modules\
node-rsa\src\NodeRSA.js:170:21)
    at IncomingMessage.<anonymous> (C:\src\qteddev\node\main.js:187:36)
    at IncomingMessage.emit (events.js:92:17)
    at _stream_readable.js:929:16
    at process._tickCallback (node.js:419:13)

这就是我在客户端生成公钥的方式

public static void getPublicKeyFromPemFormat(String PEMString,
                                                       boolean isFilePath) throws IOException, NoSuchAlgorithmException,
            InvalidKeySpecException 

        BufferedReader pemReader = null;
        if (isFilePath) 
            pemReader = new BufferedReader(new InputStreamReader(
                    new FileInputStream(PEMString)));
         else 
            pemReader = new BufferedReader(new InputStreamReader(
                    new ByteArrayInputStream(PEMString.getBytes("UTF-8"))));
        
        StringBuffer content = new StringBuffer();
        String line = null;
        while ((line = pemReader.readLine()) != null) 
            if (line.indexOf("-----BEGIN PUBLIC KEY-----") != -1) 
                while ((line = pemReader.readLine()) != null) 
                    if (line.indexOf("-----END PUBLIC KEY") != -1) 
                        break;
                    
                    content.append(line.trim());
                
                break;
            
        
        if (line == null) 
            throw new IOException("PUBLIC KEY" + " not found");
        
        Log.i("PUBLIC KEY: ", "PEM content = : " + content.toString());

        KeyFactory keyFactory = KeyFactory.getInstance("RSA");

        publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(Base64.decode(content.toString(), Base64.DEFAULT)));
        //Log.i("GENERATED EXPONENT AND MODULUS = ", publicKey.toString());
    

这是客户端的加密:

cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, QtedEncryption.publicKey);
cipherData = cipher.doFinal(password.getBytes());
password = Base64.encodeToString(cipherData, Base64.DEFAULT);

然后通过 POST 请求将密码发送到服务器。

var password = key.decrypt(requestData.password,'utf8');

使用此代码启动服务器时会生成公钥和私钥

var rsa = require('node-rsa');

//create RSA-key
var key = new rsa(b: 1024); 
console.log(key.getPrivatePEM());
console.log(key.getPublicPEM());

【问题讨论】:

有这方面的信息吗? 【参考方案1】:

改用Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");'node-rsa' 似乎默认为 OAEP 填充,目前您根本没有使用 RSA 填充方案。

【讨论】:

以上是关于Nodejs 使用node-rsa 加密数据的主要内容,如果未能解决你的问题,请参考以下文章

node-rsa模块加密遇到的一些坑

nodejs安装node-rsa遇到的问题及解决

node-rsa

节点包“node-rsa”的解密问题

nodeJS之crypto模块公钥加密及解密

NodeJs使用md5对数据加密