Búsqueda de sitios web

javascript - Cifrar/Descifrar RSA en TypeScript


Estoy usando Angular 4 para hacer el front-end de mi aplicación. He implementado OAuth2 en mi backend (desarrollado con Spring en Java), por lo que las personas que usan mi aplicación deben estar autenticadas.

El caso es que podemos ver claramente las contraseñas desde los registros del servidor backend y podrían ser capturadas por un MITM hasta que agregue un SSL.

Por eso decidí encriptar la contraseña enviada con RSA. Mi backend ya está listo, pero no encuentro ninguna biblioteca actualizada que proporcione una API decente para encriptar/desencriptar con un par de claves RSA.

También se ha visto el módulo crypto, pero ya no es usable en ECMAS6. El de crypto-js solo proporciona AES y algunos hashing como MD5/SHA.

Respuesta #1

Finalmente encontré una manera, después de instalar algunos.

npm install buffer
npm install crypto-browserify

Entonces úsalo

import {config} from "../app.config";
import {Buffer} from 'buffer/';
import * as crypto from "crypto-browserify";

export class RsaService {
  private privateKey: string;
  private publicKey: string;
  private enabled: boolean;

  constructor() {
    this.privateKey = config.authentication.rsa.privateKey;
    this.publicKey = config.authentication.rsa.publicKey;
    this.enabled = config.authentication.rsa.enabled;
  }

  isEnabled(): boolean {
    return this.enabled;
  }

  encrypt(plaintext: string): string {
    if (!this.enabled)
      return plaintext;

    let buffer = new Buffer(plaintext);
    let encrypted = crypto.privateEncrypt(this.privateKey, buffer);

    return encrypted.toString('base64');
  }

  decrypt(cypher: string): string {
    if (!this.enabled)
      return cypher;

    let buffer = Buffer.from(cypher, 'base64');
    let plaintext = crypto.publicDecrypt(this.publicKey, buffer);

    return plaintext.toString('utf8')
  }
}

Respuesta #2

Dependiendo de dónde se hayan capturado esos registros de red, es realmente posible recuperar toda la cadena HTTP en un texto puro, una vez que el SSL funciona en una capa de comunicación específica, solo hay que escuchar el flujo en una capa superior y ¡boom!, está ahí, esta es una respuesta para algunos comentarios anteriores.

Acerca de la arquitectura en sí, tiene completo sentido una vez que te preocupa proteger tus datos de ojos no deseados, así que de manera teórica sugeriría algunos enfoques:

1) crea tu propio método de encriptación y úsalo en ambos lados. Una simple multiplicación de matrices podría ser útil, suena una locura lo sé, pero si es un flujo no crítico no veo ningún problema con eso

2) usar cryto-js en ambos lados también, como, llamar a una porción de código javascript desde tu código java para (des)encriptar la contraseña

3) usa una entidad externa de autenticación/autorización, como Google, Twitter, Facebook, o una solución más empresarial como IBM BlueID, Azure o AWS o incluso tu propio controlador de dominio para eso, o incluso más, puedes usar una entidad externa de autenticación con tu propio controlador de dominio, se llama Federación

Quiero decir, hay varias opciones para solucionarlo, desde algo muy simple como hacer tu propia solución hasta una estructura enorme, no estoy seguro de en qué punto te encuentras entre esos dos, pero está bien, ten cuidado con los datos sensibles.

Artículos relacionados