TypeScript 中的 RSA Encrypt/Decrypt

RSA Encrypt/Decrypt in TypeScript

我正在使用 Angular 4 制作我的应用程序的前端。我已经在我的后端实现了 OAuth2(在 Java 中使用 Spring 开发),因此使用我的应用程序的人必须经过身份验证。

问题是我们可以从后端服务器日志中清楚地看到密码,并且在我添加 SSL 之前它可能会被 MITM 捕获。

这就是为什么我决定用 RSA 加密发送的密码。我的后端已经准备就绪,但我没有找到任何 为来自 RSA 密钥对的 encrypt/decrypt 提供像样的 API 的最新库。

也看到了 crypto 模块,但在 ECMAS6 上不再可用。 crypto-js 仅提供 AES 和一些散列,例如 MD5/SHA.

根据捕获这些网络日志的位置,确实有可能以纯文本形式取回所有 http 管道,例如,一旦 SSL 在特定通信层上工作,它就可以在更高层上侦听流繁荣,它在那里,这是对上面一些评论的回答。

关于体系结构本身,一旦您担心保护您的数据免受不必要的眼睛,就完全有意义了,所以从理论上讲,我会建议一些方法:

1) 创建自己的加密方法并在双方使用。一个简单的矩阵乘法可能很有用,我知道这听起来很疯狂,但如果它是一个非关键流程,我看不出有任何问题

2) 双方也使用 cryto-js,例如,从您的 java 代码调用 java 脚本代码部分来(解密)加密密码

3) 使用外部 authentication/authorization 实体,如 google、twitter、facebook,或更多的企业解决方案,如 IBM BlueID、Azure 或 AWS,甚至你自己的域控制器,或更进一步,您可以将外部身份验证实体与您自己的域控制器一起使用,它称为 Federation

我的意思是,有几种方法可以解决这个问题,因为非常简单,比如制作自己的解决方案,直到一个巨大的结构,比如,不确定你在这两点之间的位置,但注意敏感数据很酷.

终于找到方法了,安装了一些。

npm install buffer
npm install crypto-browserify

那就用吧

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')
  }
}