node-rsa icon indicating copy to clipboard operation
node-rsa copied to clipboard

Use in browser

Open bernardoadc opened this issue 3 years ago • 1 comments

So I am trying to encrypt data using public key from backend in the browser. Since it's not https, I can't really use crypto.subtle. I've tryed bundling with browserify with no success. I ended up using rollup:

import { rollup } from 'rollup'
import resolve from '@rollup/plugin-node-resolve'
import commonjs from 'rollup-plugin-commonjs'
import globals from 'rollup-plugin-node-globals'
import builtins from 'rollup-plugin-node-builtins'
import { terser } from 'rollup-plugin-terser'

export default [
  {
    input: 'node_modules/node-rsa/src/NodeRSA.js',
    output: {
      file: 'web_modules/node-rsa.js',
      format: 'iife',
      name: 'NodeRSA'
    },
    plugins: [
      resolve({
        browser: true,
        preferBuiltins: false
      }),
      commonjs(),
      globals(),
      builtins()
    ]
  },
  {
    input: 'node_modules/node-rsa/src/NodeRSA.js',
    output: {
      file: 'web_modules/node-rsa.min.js',
      format: 'iife',
      name: 'NodeRSA',
      sourcemap: true
    },
    plugins: [
      resolve({
        browser: true,
        preferBuiltins: true
      }),
      commonjs(),
      globals(),
      builtins(),
      terser()
    ]
  }
]

But something is not right. When encrypting it shows this error message:

const key = new NodeRSA()
const publicKey = `-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAI6YyPTvCoQdVdmQh7BhweUthE3klCL9
FvPCHDTl2TGSQJyv3D/v6w8fJDDzOMziow+oEia46VSNWjkp75iZXO8CAwEAAQ==
-----END PUBLIC KEY-----`
key.importKey(publicKey, 'public')

let e = key.encrypt('hello you')

Uncaught Error: Error during encryption. Original error: TypeError: crypt.createHash is not a function at NodeRSA.$$encryptKey (:10496:31) at NodeRSA.encrypt (:10451:33) at :1:13

Is the bundling missing something? (also, couldn't a browser single file version be included in future releases?)

bernardoadc avatar Sep 08 '20 17:09 bernardoadc

Replace 'crypto' with 'crypto-browserify' in src directory.

const rollup = require('rollup');
const resolve = require('@rollup/plugin-node-resolve');
const commonjs = require('rollup-plugin-commonjs');
const globals  = require('rollup-plugin-node-globals');
const builtins = require('rollup-plugin-node-builtins');
const json = require('@rollup/plugin-json');
const { terser } = require('rollup-plugin-terser');

module.exports = [
  {
    input: 'src/NodeRSA.js',
    output: {
      file: 'dist/node-rsa.js',
      format: 'umd',
      name: 'NodeRSA'
    },
    plugins: [
      json(),
      resolve({
        browser: true,
        preferBuiltins: false
      }),
      commonjs(),
      globals(),
      builtins()
    ]
  },
  {
    input: 'src/NodeRSA.js',
    output: {
      file: 'dist/node-rsa.min.js',
      format: 'umd',
      name: 'NodeRSA',
      sourcemap: true
    },
    plugins: [
      json(),
      resolve({
        browser: true,
        preferBuiltins: true
      }),
      commonjs(),
      globals(),
      builtins(),
      terser()
    ]
  }
]

deju avatar Jul 03 '23 03:07 deju