JavaScript - TypeScriptでのRSA暗号化/復号化
私はアプリケーションのフロントエンドを作るためにAngular 4を使用しています。バックエンド(JavaのSpringで開発)にOAuth2を実装しているので、私のアプリケーションを使う人は認証される必要があります。
問題は、バックエンドサーバーのログからパスワードをはっきりと見ることができ、SSLを追加するまでMITMによって捕まる可能性があるということです。
だから私は送信されたパスワードをRSAで暗号化することにしました。バックエンドはすでに準備できていますが、RSAのキー ペアから暗号化/復号のためのまともなAPIを提供する最新のライブラリが見つかりません。
また crypto モジュールも見ましたが、ECMAS6ではもう使えません。crypto-js のものはAESとMD5/SHAなどのハッシュのみを提供します。
回答 #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
それらのネットワークログがどこで取得されたかによりますが、純粋なテキストのようにすべてのHTTPパイプラインを取り戻すことは本当に可能です。一度SSLが特定の通信レイヤーで機能すると、高いレイヤーでストリームを聴くだけで、ブーム、そこにあります。これは上のいくつかのコメントに対する答えです。
建築自体については、望ましくない目からデータを守ることを心配している場合には完全に意味がありますので、理論的にはいくつかのアプローチを提案します。
1) 自分自身の暗号化方法を作成し、それを両方の側で使用してください。単純な行列の掛け算が役立つかもしれません。狂っているように聞こえるのは分かりますが、重要でないフローであれば、問題はないと思います
2) 両側でcrypto-jsも使用します。例えば、JavaのコードからJavaScriptのコード部分を呼び出してパスワードを(暗号化/復号化)するようにします
3) Google、Twitter、Facebookのような外部認証/認可エンティティ、あるいはIBM BlueID、Azure、AWSのようなよりエンタープライズ向けのソリューション、または独自のドメインコントローラーを使用することもできます。さらに進んで、独自のドメインコントローラーと外部認証エンティティを組み合わせて使用することもでき、これはフェデレーションと呼ばれます。
つまり、それを解決するためのいくつかの選択肢があります。非常に簡単に自分で解決策を作るような方法から、巨大な構造のようなものまであります。その二つの間のどの位置にいるのかはわかりませんが、敏感なデータには注意するのが良いでしょう。
