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')
}
}
我正在使用 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')
}
}