ウェブサイト検索

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のようなよりエンタープライズ向けのソリューション、または独自のドメインコントローラーを使用することもできます。さらに進んで、独自のドメインコントローラーと外部認証エンティティを組み合わせて使用することもでき、これはフェデレーションと呼ばれます。

つまり、それを解決するためのいくつかの選択肢があります。非常に簡単に自分で解決策を作るような方法から、巨大な構造のようなものまであります。その二つの間のどの位置にいるのかはわかりませんが、敏感なデータには注意するのが良いでしょう。

関連記事