【问题标题】:RSA Encrypt/Decrypt in TypeScriptTypeScript 中的 RSA 加密/解密
【发布时间】:2017-10-09 08:40:56
【问题描述】:

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

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

这就是为什么我决定使用 RSA 加密发送的密码。我的后端已经准备好,但我没有找到任何最新的库为从 RSA 密钥对加密/解密提供合适的 API。

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

【问题讨论】:

  • 没有什么 Angular 特定的。您可以在 JavaScript 或 TypeScript 中搜索相同的问题。
  • 为什么服务器日志文件中存在密码?
  • 我已经做了,什么都没有
  • @yılmaz 因为这是网络日志,谁在乎。我只是想加一个安全层,我不想清楚地发送它
  • 我也很好奇即使你使用 ssl,你是如何通过 mitm 获取密码的?

标签: javascript angular typescript encryption rsa


【解决方案1】:

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

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

【讨论】:

  • ,我正在尝试在我的项目中使用您的解决方案。我在下面的行中无法读取 2 null 的属性 let encrypted = crypto.privateEncrypt(this.privateKey, buffer)。你能帮忙吗?
  • crypto 为空,你没有npm install buffer npm install crypto-browserify
  • @Romeortec 我遇到了同样的问题。两个库均已正确安装。
  • @Madhesh 你知道了吗?
  • 你必须像我写的那样安装缓冲区和加密浏览器
【解决方案2】:

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

关于架构本身,一旦你担心保护你的数据不被不受欢迎的人看到,那就完全有意义了,所以从理论上讲,我会建议一些方法:

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

2) 在两边也使用 cryto-js,例如,从你的 java 代码中调用一个 javascript 代码部分来(去)加密密码

3) 使用外部身份验证/授权实体,例如 google、twitter、facebook,或者更企业级的解决方案,例如 IBM BlueID、Azure 或 AWS,甚至您自己的域控制器,甚至可以使用外部身份验证拥有您自己的域控制器的实体,称为联邦

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

【讨论】:

  • “创建你自己的加密方法” - 这是一个糟糕的建议。参见例如security.stackexchange.com/q/18197/72084
  • 当有这么多人在做着出色的工作时,创建自己的加密毫无意义。创建自己的适合不想学习新语言/库/功能的懒惰开发人员
猜你喜欢
  • 2012-03-13
  • 2015-03-16
  • 1970-01-01
  • 2011-12-10
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多