ドキュメント
/

バイトコード配列エンコーディングキー

バイトコード配列エンコードキーの外部化

Pro

vmBytecodeArrayEncodingKey で独自の VM バイトコード暗号化キーを指定し、キーゲッターを介して実行時にそれを返します - バンドルの外に保持し、クライアントストレージから読み取り、あるいはバックエンドから取得します。

これらのオプションの役割

vmBytecodeArrayEncoding は VM バイトコード配列を暗号化し、出力内に平文として 存在しないようにします。デフォルトでは、暗号化キーは環境から導出されクライアント側で再構築されるため、キーを 一切扱う必要がありません。これは便利ですが、キーの素材は依然としてバンドル内に残ります。

2 つのオプションを使えば、キーをバンドルから取り出し、自分で制御できます。

  • vmBytecodeArrayEncodingKey - コンパイル時に指定するキーです。設定すると、デフォルトの環境由来キーの代わりに 使用され、難読化された出力には埋め込まれません
  • vmBytecodeArrayEncodingKeyGetter - 実行時にその同じキーを返す JavaScript 式です。そのまま埋め込まれ、 難読化されたコードが読み込まれるときにブラウザ内で評価されます。

要点は分離です。キーがコード内に存在しないため、バンドルを純粋に静的にスキャンしてもキーを復元できません。 コードを実行するには実行時にキーが存在している必要があるため、真に秘密というわけではありませんが、キーがどこから 来て誰が見られるかを自分で決められます。

これら 2 つのオプションはペアです。ゲッターのない vmBytecodeArrayEncodingKey は、難読化されたコードに実行時に キーを取得する手段を残しません。また、対応するコンパイル時キーのないゲッターには、一致させる相手がありません。 vmBytecodeArrayEncoding: true とともに、両方を設定してください。

2 つのキーが組み合わさる仕組み

あなたのキーが単独で使われることはありません。両側で、難読化ツールが管理する内部キーと混合されます。

  • コンパイル時。 vmBytecodeArrayEncodingKey は難読化ツールが導出する内部キーと結合され、その結果得られた 混合キーでバイトコード配列がエンコードされます。
  • 実行時。 vmBytecodeArrayEncodingKeyGetter が解決する値は、さまざまな実行時要因からクライアント側で 再構築された同じ内部キーと結合され、バイトコードをデコードします。

両側であなたのキーと内部キーが混合されるため、ゲッターは vmBytecodeArrayEncodingKey として渡したまったく同じ 文字列に解決される必要があります。どちらか一方だけでは不十分です。内部キーのないあなたのキーではバイトコードを デコードできず、あなたのキーのない内部キーも役に立ちません。だからこそ、誰があなたのキーを受け取るかを制御する ことが、実際にコードを保護することになるのです。

実行時にキーを供給する

デフォルトでは、ゲッターは同期的です。難読化されたコードが読み込まれるとき、式は即座にキーを返さなければ なりません。すでにクライアント上に存在する任意のソース(Cookie、localStorage、グローバル変数、サーバーが 注入した DOM 要素など)から読み取ってください。

JavaScript

キーは難読化されたコードが実行される前に存在していなければなりません。

JavaScript

他の同期的なソースも同じように機能します。アプリがすでに設定しているものを選んでください。

JavaScript

キーは難読化されたコードと同じファイルやスクリプトに置かないでください。そこにインライン化すると、目的が完全に 台無しになります。バンドルを静的にスキャンするだけで、コードとそのキーの両方が復元されてしまいます。キーは別の ソースに保存し、コンパイル時の vmBytecodeArrayEncodingKey はコミットするのではなく、環境変数やシークレット から注入してください。

バックエンドからキーを取得する(非同期)

vmAsyncExecutor が必要 · v7.3.0+

同期的なゲッターは、すでにクライアント上にあるものしか読み取れません。サーバーからキーを取得して、認証の 背後でゲートを設けたり取り消したりできるようにするには、ゲッターを非同期にする必要があり、そのためには vmAsyncExecutor が必要です。非同期エグゼキュータを有効にすると、ゲッターは Promise を返すことができ、VM は実行前にそれを待機します。

JavaScript

Promise を返すゲッターには vmAsyncExecutor必須です。これはビルド時にチェックできないため、 vmAsyncExecutor をオフにした Promise ゲッターは実行時に失敗します。デコーダがキー文字列の代わりに Promise オブジェクトを受け取るためです。

検証済みセッションと必要なライセンス確認に基づいてキーを配信します。OriginやRefererだけでは呼び出し元を認証できず、同一オリジンのGETではOriginが省略される場合があります。レスポンスのキャッシュを無効にし、キーを正しいビルドに結び付けてバンドルと一緒に配信します。受信側のクライアントは実行時にキーを調べられます。

JavaScript

キーが一致しない場合

難読化されたコードは、ゲッターが難読化時に使用したものとまったく同じキーを返す場合にのみ動作します。キーが 異なる場合、あるいはゲッターが undefinednull、または空文字列を返す場合、復号は誤ったキーストリームを生成し、 コードは実行時にゴミ出力または通常のランタイムエラーで失敗します。

意図的に、キー固有の明確なエラーメッセージは用意されていません。失敗したキーは、他のランタイム障害と区別が つきません。そのため、このオプションを使い始めてはじめて VM で保護されたバンドルが例外をスローする場合は、まず キーのパスを確認してください。ゲッターがページ上で解決すること、空でない文字列を返すこと、そしてビルド時に使った ものと同じ値を返すことを確認します。