WeChatのチャット履歴をツールに移行すると、ごく自然に一つの疑問が生まれます。ツールはメッセージを読み取り、画像を復号できるのに、なぜ送信するときにはパソコン上のWeChatに依存しなければならないのでしょうか。ネットワーククライアントを呼び出すように、自らログインし、リクエストを送信し、結果を受信することはできないのでしょうか。
今回の調査は、ここから始まりました。目標を検証可能な範囲に絞りました。デスクトップ版WeChatを起動せず、QRコードによるログイン、初期化、テキストの送受信を独立して完了し、状態を保存する。最後にツール専用のWeChatを削除し、もう一度双方向の送受信を行う。
現在、この一連の処理は、自分のアカウントとファイル転送アシスタントを使った実機検証に成功しています。スマートフォンでは独立したプログラムから送られた全文を確認でき、独立したプログラムでもスマートフォンからの返信を受信できました。本文はバイト単位で完全に一致しています。以下では、実際に学んだ順序に沿って、その仕組みと復元過程を改めて説明します。
これは、特定のバージョンと特定のプロトコル経路を対象とした調査記録です。コードはプライベートリポジトリで個別に開発されており、WeChat Useには同梱されません。本文には、実在するアカウントの認証情報、ログイン用QRコード、チャットの原文は含まれていません。
一、目標:アプリから何を切り離すのか?
まず、WeChatで「こんにちは」と送信する場面を想像してください。ウィンドウは、連絡先の選択、テキストの入力、送信ボタンのクリックを担当します。しかし、その背後では、アカウント認証、シリアライズ、暗号化、ネットワーク接続、サーバーからの応答、ローカル状態の管理も必要です。
独立して実装したいのは、この後半部分です。
ここでいう「コア」とは、通信プロトコルとステートマシンを指し、OSカーネルのことではありません。また、WeChatの全機能を一から作り直すという意味でもありません。最小限の独立したテキストクライアントであれば、まずは明示的な受信者IDだけを受け付けるようにし、完全な連絡先一覧、グループメンバー、モーメンツ、メディアシステムまで最初から実装する必要はありません。
これにより、検収目標が具体的になります。
- 新しいセッションは、スマートフォンでQRコードをスキャンして確認し、確立しなければなりません。デスクトップ版WeChatの実行中プロセスが保持するログイン状態を流用してはなりません。
- 送信するアプリケーションリクエストは、独自のプログラムでエンコード、暗号化、転送しなければなりません。
- 受信時には、独自の同期状態を更新し、独自のメッセージデータベースへ書き込まなければなりません。
- プログラムの終了後も、新しいプロセスが状態を読み戻せなければなりません。終了していないプロセスを常駐させ、見せかけの状態を維持するものではありません。
- デスクトップ版WeChatが起動しておらず、ツール専用コピーを削除した後でも、双方向にメッセージを送受信できなければなりません。
前回のWeChatの画像はどのように暗号化され、私たちはそれをどのように段階的に復元したのかでは、画像オブジェクトとキャッシュの復元について調査しました。今回は、そこからさらに一段階手前へ進みます。メッセージは、ローカルのチャット履歴になる前に、どのようにネットワークからクライアントへ届くのでしょうか?
二、まず三つを区別する:伝送、業務、保存
「WeChatはAESを使っている」と言うだけでは、まったく不十分です。なぜなら、同じ内容でも、置かれている場所によって異なる形式で封入され、使用される鍵や状態も異なるからです。
今回は、それを三つの層に分けます。
| 層 | 解決する問題 | 今回の調査における対象 |
|---|---|---|
| 伝送保護 | この接続で、信頼できる暗号化通信路をどのように確立するか、レコードが改ざんされていないか | MMTLSハンドシェイク、レコード認証、短時間接続の再開 |
| 業務封入 | アカウントがどのように本人性を証明し、1回の送信または同期要求をどのようにエンコードするか | ログインプロトコル、業務暗号化、リクエストヘッダー、メッセージ本文 |
| ローカル永続化 | 受信したメッセージと次回の同期位置をどのように確実に保存するか | 独自の受信データベース、トランザクション、カーソル、操作記録 |
画像DATの復号は、通信セッションの解読と同じではありません。伝送ハンドシェイクの成功も、アカウントへのログイン成功を意味するわけではありません。さらに、アカウントへのログイン後も同期状態を初期化して、はじめて差分メッセージを正しく受信できます。
まずは、処理全体の流れを次のように捉えてください。
flowchart TD
A[独自クライアント] --> B[認証済み伝送チャネルの確立]
B --> C[ログイン用QRコードの取得]
C --> D[スマートフォンでスキャンして確認]
D --> E[アカウント認証の完了]
E --> F[初回初期化と同期]
F --> G[独自のアカウント状態とメッセージDBへ保存]
G --> H[テキスト送信リクエスト]
G --> I[メッセージの増分同期]
H --> J[サーバー応答とスマートフォンでの照合]
I --> K[メッセージと新しいカーソルを同一トランザクションでコミット]
この図は、「curlで送信するだけ」が見た目ほど単純ではない理由も示しています。HTTPリクエストは、あくまで外殻の一つにすぎません。真に独立させるべきなのは、リクエストの前にどのような状態を準備するのか、パケット内のバイト列をどのように生成するのか、そしてレスポンスの後にどの状態の変更を許可するのかという点です。
三、プロセス:まずチャネルを確立し、その後にアカウントを扱う
1. 暗号化接続の要点は、相手が誰であるかを証明すること
この転送実装は、新しい楕円曲線の一時鍵から開始し、サーバー署名を検証して、ハンドシェイク完了段階の検証値を確認します。その後ではじめて、送信側と受信側それぞれの鍵とシーケンス番号を確立します。
ここでは、二つの概念を分けて考える必要があります。
鍵交換によって双方は共通の秘密を導出できます。一方、身元認証によってクライアントは、秘密を交換した相手が確かに想定したサーバーであることを確認できます。前者だけでは、データを復号できることが、その接続を信頼できることを自動的に意味するわけではありません。
レコードのシーケンス番号も同様に重要です。これは一つの接続における暗号化状態の管理に関与するため、送信方向と受信方向で共用することはできず、失敗したコンテキストを流用して次のパケットを組み立てることもできません。この実装では、シーケンス番号がオーバーフローした場合は直ちに拒否し、失敗したコンテキストの再利用を停止します。
この経路では P-256 などの暗号要素を使用しますが、MMTLS には独自のメッセージと状態に関する規約があります。これをそのまま「標準 TLS 1.3」と呼び、汎用 TLS ライブラリがプロトコル全体を実装済みだと仮定することはできません。
短時間接続では、認証済みのセッションチケットと再開鍵の導出も関係します。その目的は、接続を再確立するたびにかかるコストを削減することです。前回の一時秘密鍵と暗号化コンテキスト一式をディスクに保存し、そのまま繰り返し使用するという意味ではありません。
2. QRコードはログインフローへの入口
チャネルが確立されると、クライアントはQRコードをリクエストできます。しかし、有効なPNGを取得できたことは、画像を取得したことを証明するだけで、アカウントへのログインが完了したことを証明するものではありません。
復元したログインフローは、次のように要約できます。
Get QR → QRコードを表示 → スマートフォンでスキャンして確認
→ Checkで同一QRコードの状態を確認
→ 最終アカウント認証 → 認証済みアカウント情報を保存
このバージョンの経路では、取得と確認はそれぞれ Get 502 と Check 503 に、最終認証は Manual 252 に対応します。これらの番号は、このプロトコル経路の分析で使用した操作識別子であり、外部向けの安定したAPIではありません。
ここで最も見落としやすいのは、「同一のQRコード」であることです。確認応答は、元のリクエストの識別情報およびQRコードの発行元と結び付ける必要があります。古いQRコードの確認結果を使って新しい認証処理を完了させることはできません。また、ユーザーが「スキャンした」と言っただけで、サーバーの状態確認を省略することもできません。
スマートフォンでのスキャン確認は、認可操作です。プログラムができるのはプロトコルフローを完了させることであり、ユーザーによるアカウントログインの確認を代行することではありません。
3. ログイン内部には、さらにもう一段階の鍵合意がある
最終認証の内部で行われるのは、単に「スキャン結果を返送する」ことだけではありません。このバージョンの経路では、ネストされた secp224r1 の鍵合意を復元しました。非圧縮公開鍵は57バイト、得られる共有 X 座標は28バイトで、その後、観測したアルゴリズムに従ってパッケージの復号に使用する鍵を導出します。
これは、前述の P-256 とは役割が異なります。P-256 は転送ハンドシェイクの経路に、secp224r1 はこのログイン処理の経路に現れます。どちらも単に「ECDH鍵」と略記すると、実装時に入力を誤接続しやすくなります。
このログイン分岐では、共有 X の MD5 結果が CBC ラッピングに使用され、key と IV に同一のバイト列が用いられることを確認しました。これは既存プロトコルとの互換性のために復元したものであり、新規システムに推奨する暗号設計ではありません。
同様に、ここでの MD5 をサーバーの身元認証と見なすことはできません。ハッシュ、業務上の検証値、ハンドシェイク署名は、それぞれ異なる役割を担っています。いずれかが欠けている場合に、別のものが「こちらも検証しているように見える」という理由で代用することはできません。
四、ログイン後、なぜすぐに通常のメッセージ受信を開始できないのか?
新しい入館カードを受け取ったと想像してください。そのカードは入館できることを示しますが、前回どのメッセージまで読んだのかは教えてくれません。
独立クライアントも、初回ログイン後に初期同期状態を取得する必要があります。今回のフローでは、まず NewInit 139 を実行し、レスポンスに含まれるバインド済みの初期化フィールドを用いて自身の同期開始点を確立した後、最初の NewSync を実行します。
ここでは、ある細部を明確に確認しました。使用するのは Init レスポンスの f2 フィールドです。あるサンプルで f2 と f3 の内容がたまたま同一だったとしても、それを理由にフィールドの識別を無視することはできません。偶然の一致は、相互交換可能なプロトコル契約を意味しません。
最初の同期が完了してから、自身の受信データベースをコミットし、実行構成を生成します。これにより、「初期化完了」とは、ある関数が 0 を返したことではなく、永続化され、新しいプロセスから再読み込みできる一連の状態を意味します。
同期カーソルは「最後のメッセージ ID」ではない
チャットソフトウェアの差分状態は、通常タイムスタンプよりも複雑です。解析した SyncKey は、識別子を持つ状態値の集合であり、プロトコルのルールに従ってマージする必要があります。最後のメッセージ ID で安易に代用することはできません。
1 回のレスポンスに含まれるのも、1 件のテキストだけではありません。そこにはコマンドのリストが含まれ、コマンドごとに異なる変化を表します。メッセージコマンドについては、ネストされた文字列、元のフィールド、完全な整数値を保持しています。認識できないコマンドについても生データを保持し、暗黙のうちに破棄したにもかかわらず、同期が完全であるかのように扱うことを避けています。
メッセージ ID は JavaScript の Number が安全に表現できる整数範囲を超えることもあります。ストレージとインターフェースでは、完全な 64 ビット値を保持しなければなりません。JSON を経由する箇所では、いったん浮動小数点数に変換してから戻すのではなく、正確な 10 進数文字列を使用する必要があります。
なぜメッセージとカーソルを同時にコミットする必要があるのか?
メッセージのバッチ M と、新しいカーソル K を受信したと仮定します。
K を先に保存し、その後プロセスがクラッシュすると、M は保存されません。すると次回、サーバーは K より後から処理を続行し、メッセージの欠落が発生する可能性があります。反対に M を先に保存し、K を保存しなかった場合は、次回に同じメッセージバッチを再度受信する可能性があります。
この実装では、元のレスポンスと取得元の要約を保持したうえで、独自のデータベーストランザクション内で、メッセージのバージョン、バッチの情報、および新しいカーソルを同時にコミットします。
バッチレスポンス全体を検証
↓
追跡可能な元のレスポンスを保存
↓
BEGIN
メッセージのバージョンを書き込む
バッチの重複排除情報を書き込む
同期カーソルを更新
COMMIT
いずれかの検証に失敗した場合、カーソルは進めません。この設計では、デスクトップ版 WeChat のオンラインデータベースを読み取ったり変更したりする必要はありません。管理するのは、独立クライアント自身のデータです。
5. 1件のテキストは、どのようにネットワークリクエストになるのか?
ここまでで、アカウント状態と同期の開始点がそろいました。ここでようやく「こんにちは」を送信できます。
まず、受信者、本文、および関連するビジネスフィールドを protobuf バイト列にエンコードします。protobuf が担うのは構造化エンコーディングだけであり、暗号化は行いません。続いて、ビジネス層が選択されたモードに応じて圧縮と暗号化を処理し、ビジネスヘッダーとチェック値を加え、最後にトランスポート層のレコードへ格納して送信します。
flowchart LR
A[受信者とテキスト] --> B[protobuf ビジネスペイロード]
B --> C[モードに応じた圧縮と暗号化]
C --> D[ビジネスヘッダーとチェック値]
D --> E[トランスポート暗号化レコード]
E --> F[サーバー]
圧縮と暗号化の順序は逆にできない
今回の静的な復元では、ordinary mode 5 と mode 13 という 2 つのビジネスペイロードのエンコード分岐を対象としています。
mode 5 では、zlib 圧縮に効果があるかを判定してから、AES-128-CBC を使用します。パケットヘッダーにある元の長さと、選択された暗号化前の長さには、それぞれ異なる意味があるため、すべてを暗号文の長さとして記録することはできません。
一方、mode 13 では強制的な圧縮と AES-GCM を採用し、観測されたフォーマットには、暗号文、12 バイトの nonce、16 バイトの tag が含まれています。AEAD の tag は、暗号文と対応する入力の完全性を検証するために使用され、nonce の生成に関する制約もプロトコルの正当性の一部です。RFC 5116 には、このような認証付き暗号インターフェースと nonce の要件についての一般的な説明がありますが、WeChat プロトコルの仕様書ではありません。
今回、実在するアカウントでの送受信に使用されたのは、確認済みの通常の CBC5 経路です。もう一方のエンコード分岐についてオフラインテストを実装したからといって、実際のすべての送受信が GCM を経由するわけでも、未識別のすべてのモードに自動的に対応できるわけでもありません。
そのまま移植するのが最も難しいのは、プロトコル固有の計算ロジック
標準的な AES、楕円曲線、zlib には、いずれも成熟した実装があります。しかし、プロトコル固有のチェック値は、「よく使われるアルゴリズムを 1 つ選ぶ」だけでは再現できません。
ここでは、ある固定モジュール内の計算ロジックに遭遇しました。デスクトップ版 WeChat の関数をそのまま呼び出し続けると、「独立クライアント」でありながら、アプリケーション本体への依存が残ります。そこで、これをデータとして解析し、実際に使用される命令をデコードして、制限付きインタープリターを実装しました。
インタープリターがアクセスするのは、自身がマッピングしたメモリだけです。出所の不明なアドレスをホストポインターとして扱わず、任意の外部コールも許可せず、命令ステップ数の上限も設定しています。現在は、実際に使用される 55 種類の命令をカバーしており、モジュールのバイト列にも固定のダイジェスト制約を設けています。
この経路では、暗号化後のビジネスペイロードから入力を生成し、それをモジュールに渡して計算させ、最終的に規定された長さの結果を取得します。戻り値、出力長、および実際の書き込みを検証し、いずれか 1 つでも条件を満たさなければ、パケットの組み立てを続行しません。
ここで得られた重要な教訓は、プロトコルの復元とは、単に鍵を探すことではなく、正当なリクエストの生成に必要な計算と状態も復元することである、ということです。局所的なチェック値を計算できたとしても、それで証明できるのは局所の関数が出力を返したことだけです。最終的には、完全なリクエストと実際のレスポンスを通じて検証する必要があります。
6.受信は逆方向のアンパックだが、送信コードを逆に実行することではない
サーバーからレスポンスを受信したら、まず転送レコードを検証し、対応するビジネス層のカプセル化を解除し、コマンドとメッセージを解析して、最後に同期トランザクションへ進みます。
これは、方向は反対でも役割は近い経路ですが、送信側のすべての前提を機械的に再利用することはできません。たとえば、あるエンコーダーが自作データを暗号化し、さらに復号して元に戻せたとしても、それで証明できるのは内部的な整合性だけです。双方がフィールドの意味を同じように誤って実装していれば、ラウンドトリップテストはそれでも成功する可能性があります。
そのため、固定サンプルのフィールドと境界、改変されたデータを拒否する動作、実際のサーバーレスポンス、そしてスマートフォン側の完全な本文との対応関係を、それぞれ分けて検証します。これらの証拠が一連につながってはじめて、その受信経路が正常に動作したと判断できます。
メッセージの受信には継続的なポーリングが必須なのか?
ここでは、公式のネットワークコンポーネントと、現在の私たちの実装を区別する必要があります。
Tencent が公開している Mars は、ネットワーク通信コンポーネントを提供しており、STN には長短コネクションやハートビートなどの仕組みが含まれています。これはネットワーク全体のアーキテクチャを理解するうえで役立ちますが、公開されているネットワークコンポーネントが、WeChat のアカウント、ログイン、ビジネスプロトコルを含む完全な実装であるわけではありません。
私たちの独立ツールでは、現在、明示的な差分取得と、ハートビートの通知後に同期する経路までが接続済みです。長時間接続によるプッシュ通知はまだ完全には接続されていません。そのため、現在のツールが公式のプッシュ機構を完全に再現しているとはいえませんし、逆に WeChat 公式が固定間隔のポーリングだけに依存しているともいえません。
ツールに設定されている待機間隔とタイムアウトは、私たち独自の運用方針です。プロトコル内に待機時間らしき数値があっても、その単位がまだ明確に特定されていなければ、数値の大きさだけを根拠に「何秒」と解釈することはできません。
七、デスクトップ版 WeChat から本当に独立していることを、どう証明するのか?
ウィンドウを閉じるだけでは不十分です。アプリケーションがバックグラウンドで動作しているかもしれませんし、私たちのプログラムが密かに元のアプリケーション内のリソースを読み取ったり、以前のバックグラウンドサービスを流用したりしている可能性もあります。
そのため、最終検証では「コマンドの終了コードが 0」であることに加え、さらにいくつかの確認を行いました。
まず、独立した QR コードのスキャンで作成した新しいアカウント情報を使い、初期化と独自のメッセージ保存を完了させました。その後、新しいプロセスをソースコードのディレクトリ外から起動し、ネットワークを禁止した状態で受信箱とカーソルを読み戻しました。これは、状態が確実に保存されたことを証明します。ただし、オフラインの status コマンドがサーバーへ再度ログインしたことを証明するものではありません。
次に、現在のコンピューターでツール専用の WeChat を通常どおり終了し、このコピーをゴミ箱へ移動しました。チャットデータは削除しておらず、アプリケーションは復元できます。メインの WeChat は残しましたが、起動していません。
「起動していなくても、アプリケーションから密かに何かを取得しているのではないか」という疑問を避けるため、プロトコルのランタイムにはシステムのサンドボックス制限を適用しました。メインの WeChat とゴミ箱にある専用コピーのどちらに対しても読み取りを拒否し、関連する元のアプリケーションのデータディレクトリとサービスへのアクセスも制限しました。実際に読み取りを試行すると、アクセス権限の拒否が返されました。
最後に、この条件下で送信と受信をそれぞれ 1 回ずつ実行しました。
| 確認対象 | 実際の結果 | 何を示すか |
|---|---|---|
| テキスト送信 | サーバーが受理し、スマートフォンにテスト本文が完全に表示された | 独立した送信経路がスマートフォンまで到達した |
| テキスト受信 | 新着メッセージの本文がスマートフォンからの返信とバイト単位で一致し、サーバーのメッセージ ID が 0 ではなかった | 独立した同期によって該当メッセージを取得できた |
| 同期状態 | シーケンスが 2 から 3 に進み、累計 130 件のメッセージバージョンを保存した | 受信トランザクションと状態の永続化が実際に行われた |
| 実行環境 | 送受信中のサンプリングでは、いずれもデスクトップ版 WeChat のプロセスが検出されなかった | この 2 回の操作は、実行中のデスクトップ版 WeChat に依存していなかった |
| アプリケーションへの依存 | 専用コピーの元のパスは存在せず、メインアプリケーションとゴミ箱のコピーへの読み取りはサンドボックスによって拒否された | ランタイムは、この 2 つのアプリケーションを読み取って操作を完了することができない |
| ライフサイクル | 元の子プロセスの終了記録、結果とリクエストの対応関係をすべて照合した | 成功が別のリクエストや残存プロセスによるものではない |
ここでいう 130 は、保存されたメッセージバージョンの件数であり、130 件の独立した新規チャットを受信したと主張するものではありません。最後の差分受信では 2 件のメッセージバージョンが追加され、そのうち 1 件の新規メッセージの本文が、スマートフォンからのテスト返信と完全に一致しました。
より正確にいうと、結論は次のとおりです。**ツール専用の WeChat を移動し、メインの WeChat を起動せず、さらにプロトコルプロセスから読み取れない状態で、独自のテキスト双方向送受信を完了しました。**コンピューター上のすべての WeChat ファイルを削除したという意味ではありません。
八、なぜ操作記録も通信の中核に含まれるのか?
送信要求では、サーバーはすでに処理したものの、クライアントが応答を受け取れないという厄介な状況が起こりえます。このとき自動的にもう一度送信すると、重複配信になるおそれがあります。
そのため、まず送信意図を永続化してから、実行を担う具体的な子プロセスを生成します。要求、パラメーターの要約、プロセスの識別情報、結果、終了記録を、すべて同一の操作単位に関連付けます。結果が不明な場合は記録を保持して自動再試行を停止し、ファイルが一時的に現れないからといって、未送信だったとみなしてはなりません。
受信にも同様の問題がありますが、こちらはバッチ単位の重複排除とアトミックコミットによって、ローカルでの重複を制御できます。これに対して、送信側の状態が不明な場合、ローカルの重複排除だけでは、リモート側で実行されていないことを証明できません。
これが、今回のコンピューター間移行で、ログイン情報だけをコピーするのでは不十分だった理由でもあります。整合性のある受信データベースと過去の操作記録もコピーし、さらに旧コンピューターが同じ実行状態を使い続けないようにする必要があります。そうしなければ、2 つのクライアントが同時にカーソルを進めたり、結果不明の操作について互いに矛盾する判断をしたりするおそれがあります。
セッションファイルを 1 つ保存するのは簡単です。しかし、「これまでに何を行い、次に何ができるのか」を説明できるクライアント状態を保存してこそ、永続化の完全な意味になります。
九、結論:何ができ、何がまだできていないのか?
今回完成したのは、独立したテキスト通信コアです。スマートフォンによる QR コード認証、アカウント認証、初回初期化、独自のメッセージデータベース、差分同期、テキスト送信、そして新しいプロセスによる状態の復元に対応しています。ツール専用のデスクトップ版 WeChat を削除したあとも、テキストの双方向送受信について、スマートフォンとローカルの記録が相互に対応していることを実測で確認できました。
ただし、これはまだ完全な WeChat クライアントではありません。完全な連絡先リストとグループメンバーのマッピング、任意の送信先への対応、メディアの送受信、完全な長時間接続によるプッシュ通知、長時間稼働の安定性については、この 2 回のテキスト検証から保証することはできません。以前実現した画像の復号も、自動的にこの新しいコアのメディア機能になるわけではなく、別途接続して検証する必要があります。
この研究を通して、もっとも伝えたい学習方法は、大規模なアプリケーションを、入力・出力・状態を持ついくつかの境界に分解し、それぞれの境界に対応する証拠を探すことです。
QR コードが表示されたら、アカウント認証まで完了したかをさらに確認する。レスポンスを解析できたら、メッセージとカーソルが一緒にコミットされているかをさらに確認する。サーバーから成功が返されたら、スマートフォンでも結果を照合する。新しいプロセスが起動できたら、元のアプリケーションを流用していないかをさらに確認する。
このように一層ずつ仕組みを復元していくことで、「アプリケーションから独立してリクエストを送る」という発想が、独立して動作し、再検証できる通信プログラムへと変わったのです。
復習では、この7つの問いに沿って確認する
- ウィンドウを閉じた後、通信しているのは誰か? アプリケーションのUI、プロトコルクライアント、サーバーを区別する。
- なぜAES鍵を1つだけ探さないのか? 転送、ビジネスロジック、ストレージでは、鍵と状態の用途が異なる。
- QRコードが表示されたらログイン完了なのか? さらにスマートフォンでの確認、同一生成元の状態確認、最終的なアカウント認証が必要となる。
- 最初のメッセージ受信はどこから始めるのか? まず初期化し、その後、正確な取得元の同期状態を使用する。
- なぜカーソルを先に保存してはいけないのか? メッセージとカーソルは、同じローカルトランザクションでコミットしなければならない。
- 送信成功は何で判断するのか? リクエストに対応する有効なレスポンスに加え、受信側で本文全体を照合する。結果が不明な場合は自動再試行しない。
- 独立性をどう証明するのか? 元のアプリケーションを実行せず、依存情報の読み取りを制限し、元のプロセスの証拠を保存したうえで、実環境における双方向の受入試験を行う。
本稿のWeChat固有のフィールドと検収結果は、今回の非公開実装および保存された原始記録に基づく。外部リンクはネットワークアーキテクチャと暗号技術の背景を補足するためだけに用い、これらの実測結果に代わる証拠とはしない。

WeChat Pay
Alipay
コメント
コメントは即時公開されますが、ポリシー違反時は非表示になる場合があります。