バイトコード配列エンコードキーの外部化
vmBytecodeArrayEncodingKey で独自の VM バイトコード暗号化キーを指定し、キーゲッターを介して実行時にそれを返します - バンドルの外に保持し、クライアントストレージから読み取り、あるいはバックエンドから取得します。
これらのオプションの役割
vmBytecodeArrayEncoding は VM バイトコード配列を暗号化し、出力内に平文として
存在しないようにします。デフォルトでは、暗号化キーは環境から導出されクライアント側で再構築されるため、キーを
一切扱う必要がありません。これは便利ですが、キーの素材は依然としてバンドル内に残ります。
2 つのオプションを使えば、キーをバンドルから取り出し、自分で制御できます。
vmBytecodeArrayEncodingKey- コンパイル時に指定するキーです。設定すると、デフォルトの環境由来キーの代わりに 使用され、難読化された出力には埋め込まれません。vmBytecodeArrayEncodingKeyGetter- 実行時にその同じキーを返す JavaScript 式です。そのまま埋め込まれ、 難読化されたコードが読み込まれるときにブラウザ内で評価されます。
要点は分離です。キーがコード内に存在しないため、バンドルを純粋に静的にスキャンしてもキーを復元できません。 コードを実行するには実行時にキーが存在している必要があるため、真に秘密というわけではありませんが、キーがどこから 来て誰が見られるかを自分で決められます。
これら 2 つのオプションはペアです。ゲッターのない vmBytecodeArrayEncodingKey は、難読化されたコードに実行時に
キーを取得する手段を残しません。また、対応するコンパイル時キーのないゲッターには、一致させる相手がありません。
vmBytecodeArrayEncoding: true とともに、両方を設定してください。
2 つのキーが組み合わさる仕組み
あなたのキーが単独で使われることはありません。両側で、難読化ツールが管理する内部キーと混合されます。
- コンパイル時。
vmBytecodeArrayEncodingKeyは難読化ツールが導出する内部キーと結合され、その結果得られた 混合キーでバイトコード配列がエンコードされます。 - 実行時。
vmBytecodeArrayEncodingKeyGetterが解決する値は、さまざまな実行時要因からクライアント側で 再構築された同じ内部キーと結合され、バイトコードをデコードします。
両側であなたのキーと内部キーが混合されるため、ゲッターは vmBytecodeArrayEncodingKey として渡したまったく同じ
文字列に解決される必要があります。どちらか一方だけでは不十分です。内部キーのないあなたのキーではバイトコードを
デコードできず、あなたのキーのない内部キーも役に立ちません。だからこそ、誰があなたのキーを受け取るかを制御する
ことが、実際にコードを保護することになるのです。
実行時にキーを供給する
デフォルトでは、ゲッターは同期的です。難読化されたコードが読み込まれるとき、式は即座にキーを返さなければ
なりません。すでにクライアント上に存在する任意のソース(Cookie、localStorage、グローバル変数、サーバーが
注入した DOM 要素など)から読み取ってください。
キーは難読化されたコードが実行される前に存在していなければなりません。
他の同期的なソースも同じように機能します。アプリがすでに設定しているものを選んでください。
キーは難読化されたコードと同じファイルやスクリプトに置かないでください。そこにインライン化すると、目的が完全に
台無しになります。バンドルを静的にスキャンするだけで、コードとそのキーの両方が復元されてしまいます。キーは別の
ソースに保存し、コンパイル時の vmBytecodeArrayEncodingKey はコミットするのではなく、環境変数やシークレット
から注入してください。
バックエンドからキーを取得する(非同期)
vmAsyncExecutor が必要 · v7.3.0+同期的なゲッターは、すでにクライアント上にあるものしか読み取れません。サーバーからキーを取得して、認証の
背後でゲートを設けたり取り消したりできるようにするには、ゲッターを非同期にする必要があり、そのためには
vmAsyncExecutor が必要です。非同期エグゼキュータを有効にすると、ゲッターは
Promise を返すことができ、VM は実行前にそれを待機します。
Promise を返すゲッターには vmAsyncExecutor が必須です。これはビルド時にチェックできないため、
vmAsyncExecutor をオフにした Promise ゲッターは実行時に失敗します。デコーダがキー文字列の代わりに Promise
オブジェクトを受け取るためです。
検証済みセッションと必要なライセンス確認に基づいてキーを配信します。OriginやRefererだけでは呼び出し元を認証できず、同一オリジンのGETではOriginが省略される場合があります。レスポンスのキャッシュを無効にし、キーを正しいビルドに結び付けてバンドルと一緒に配信します。受信側のクライアントは実行時にキーを調べられます。
キーが一致しない場合
難読化されたコードは、ゲッターが難読化時に使用したものとまったく同じキーを返す場合にのみ動作します。キーが
異なる場合、あるいはゲッターが undefined、null、または空文字列を返す場合、復号は誤ったキーストリームを生成し、
コードは実行時にゴミ出力または通常のランタイムエラーで失敗します。
意図的に、キー固有の明確なエラーメッセージは用意されていません。失敗したキーは、他のランタイム障害と区別が つきません。そのため、このオプションを使い始めてはじめて VM で保護されたバンドルが例外をスローする場合は、まず キーのパスを確認してください。ゲッターがページ上で解決すること、空でない文字列を返すこと、そしてビルド時に使った ものと同じ値を返すことを確認します。
