TypeScript中的RSA加密/解密

8
我正在使用Angular 4制作我的应用程序的前端。我已经在我的后端(用Java中的Spring开发)上实现了OAuth2,因此使用我的应用程序的人必须进行身份验证。
问题是我们可以清楚地从后端服务器日志中看到密码,并且它可能会被MITM拦截,直到我添加SSL为止。
这就是为什么我决定使用RSA加密发送的密码。我的后端已经准备好了,但我找不到任何最新的库,提供一个体面的API来自RSA密钥对进行加密/解密。
也看到了crypto模块,但在ECMAS6上不再可用。 crypto-js只提供AES和一些哈希,例如MD5 / SHA。

这并不是Angular特定的问题。你可以在JavaScript或TypeScript中搜索相同的问题。 - Günter Zöchbauer
@yılmaz 因为这是网络日志,谁会在意呢。我只想添加一个安全层,不想明文发送。 - Romeortec
我也很好奇,即使你使用了 SSL,你是如何通过中间人攻击获取密码的? - yılmaz
有微软的JavaScript加密库(MIT许可证):https://www.microsoft.com/en-us/download/details.aspx?id=52439,提供RSA加密/解密。 - Regis Portalez
这个问题远远超出了RSA和Typescript。如果你是一家现代化的公司,你不会以明文方式收集密码,这是毋庸置疑的。这不是一个争论的问题,就像在射击场上你不会向你的朋友开枪一样。密码应该以哈希值的形式收集和发送,使用现代的加密安全哈希系统,如bcrypt或scrypt,或者至少使用sha256来确保密码永远不能以明文形式恢复或拦截。我会尽力确保你的公司或者你正在工作的系统的建造者知道这一点,因为你会面临很多问题。 - TheEnvironmentalist
显示剩余5条评论
2个回答

8

终于找到了一种方法,在安装了一些东西之后。

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)。请问您能否提供帮助? - Selva
加密为空,你没有安装缓冲区,请运行 npm install buffer npm install crypto-browserify 安装。 - Romeortec
@Romeortec 我也遇到了同样的问题。这两个库都已经正确安装了。 - Devaffair
@Madhesh 你解决了这个问题吗? - Devaffair
你必须按照我写的安装buffer和crypto-browser。 - Romeortec
@Devaffair,我使用了CryptoJS,它对我很有效。 - Selva

-6

根据网络日志的捕获位置,很可能以纯文本形式获取所有http管道,一旦SSL在特定通信层上工作,只需在更高层上监听流,就可以轻松实现。这是对上面某些评论的回答。

关于架构本身,如果你担心保护数据不受非法侵入,那么从理论上讲,我建议采取以下几种方法:

1)创建自己的加密方法,并在两端使用它。一个简单的矩阵乘法可能会有用,听起来很疯狂,但如果它不是关键流程,我认为没有任何问题。

2)同时在两端使用cryto-js,比如从你的Java代码中调用JavaScript代码部分来(解)加密密码。

3)使用外部身份验证/授权实体,例如Google、Twitter、Facebook,或者像IBM BlueID、Azure或AWS这样的更企业级的解决方案,甚至可以使用自己的域控制器,或者进一步使用外部身份验证实体与自己的域控制器结合,这被称为联合身份验证。

我的意思是,有几种选项可以解决这个问题,从制作自己的解决方案到庞大的结构,我不确定你在这两个点之间的位置,但是注意敏感数据是很酷的。


8
"create your own encryption method" 这样的建议是很糟糕的。请参考例如https://security.stackexchange.com/q/18197/72084。 - jonrsharpe
没有必要自己创建加密算法,因为已经有很多优秀的算法可供使用。自己创建加密算法只会让人觉得你是一个懒惰的开发者,不愿意学习新的编程语言、库或特性。 - Devaffair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接