販売者(Usakeyの利用者)向け

ファイルを暗号化して配布する

製品に同梱するファイルを暗号化し、ライセンスが有効な端末のアプリでだけ開けるようにします。守れる範囲と守れない範囲、有効にする手順、暗号化のしかた、製品アプリでの開き方を説明します。

対象プラン
チーム 大規模
操作する人
オーナー 管理者 メンバー

できること・使う際の注意点

製品に同梱する設定ファイル、学習済みのモデル、データファイルなどを暗号化して配布し、ライセンスが有効な端末の製品アプリでだけ開けるようにします。チームプラン以上で使えます。ファイル本体はUsakeyに送りません。Usakeyに送るのは、ファイル先頭の短いヘッダーだけです。ヘッダーには、暗号化に使った製品の鍵や、ファイルを開くのに必要な機能権限の名前を記載しています。

ファイル暗号化機能を使う際の注意点

  • ライセンスが有効な端末の管理者は、アプリがファイルを開いた後のデータを、メモリやデバッガから取り出せます。暗号化はこれを防ぎません。
  • 一度取り出されたデータは、取り戻せません。
  • APIキーやパスワードなど、利用者に見られてはいけない値は、暗号化しても端末に置かないでください。そうした値を使う処理は、あなたのサーバーで行います。
  • ファイルを暗号化しても「解析やクラックは原理的に可能である」ことを理解したうえで使用してください。
  • 暗号化は、ファイルを作った人を証明しません。暗号化用の公開鍵を知っていれば、誰でもあなたの製品で開けるファイルを作れます。モデルの重みや設定のように差し替えられては困るファイルは、アプリで中身のハッシュを確かめてください(例)。

できること

  • 配布物(インストーラ、コンテナのイメージ、モデルファイル)を手に入れただけでは、中身を読めません。
  • ライセンスの無い端末や、端末数の上限を超えた端末では開けません。
  • ファイルに「機能権限」の名前を付けて暗号化すると、その機能権限がオン(true)のライセンスの端末でしか開けません。たとえば、プロ版のライセンスにだけ高精度のモデルを開かせ、標準版には標準のモデルだけを渡せます。機能権限は、利用ルールやライセンスに付ける名前つきのオン・オフです。
  • ライセンスの一時停止・取消・期限切れを定期確認で知った端末は、開けなくなります。通信できない端末は、それを知るまで(証明書の有効時間と、利用ルールで決めた通信断の猶予の間)開けます。
  • ファイルを1バイトでも書き換える、切り詰める、末尾に足すと開けません。

ファイルの暗号化を有効にする

  1. 手順1製品の画面で有効にする

    左のメニューの「製品」から製品を開き、「ファイルの暗号化」の欄の「ファイルの暗号化を有効にする」を押してください。確認のメッセージを読んで進めると、すぐに有効になります。オーナー・管理者・メンバーが操作できます。

    AIアシスタントに頼むこともできます。「許可する範囲」で「「製品・利用ルール・Webhook通知の設定も許可する」」を許可した接続なら、「UsakeyのMCPのスキルを使って、この製品のファイルの暗号化を有効にして、暗号化用の公開鍵を教えて」と頼めます(有効にした後は無効に戻せないので、AIは実行前に確認します)。許可が足りない接続では、AIがこの画面で操作するよう案内します。

    有効にした後は、無効に戻せません。暗号化して配布したファイルが開けなくなるためです。検証プランでは「プランに含まれていません」と表示され、有効にできません。

    製品の画面にあるファイルの暗号化の欄。状態は無効で、有効にするとこの製品のファイルを暗号化するための公開鍵を表示するという説明と、ファイルの暗号化を有効にするボタンが並んでいる。
  2. 手順2暗号化用の公開鍵をコピーする

    有効になると、「暗号化用の公開鍵」に usakey-sealing-key:v1: で始まる1行が表示されます。「公開鍵をコピー」でコピーし、暗号化ツールに渡します。

    この1行は公開鍵を含む情報で、秘密情報ではありません。CIの変数など、ビルドの設定に保存できます。ファイルを開くための秘密鍵はUsakeyの外に出ません(プロダクション環境では、取り出せない形で鍵を守る鍵管理サービスの中にあります)。公開鍵の部分は、同じ環境のすべての製品で同じ値です。

    同じ環境では1本の鍵を共用します。製品IDと鍵IDで製品を区別するため、ほかの製品のアプリでは開けません。同じ1行は、Management APIの GET /mgmt/v1/products/{product_id}/sealed-files や、AIアシスタント(MCP)の get_product_sealed_files でも取得できます。

    有効にした後のファイルの暗号化の欄。状態は有効で、暗号化用の公開鍵の1行(画像ではぼかしている)と公開鍵をコピーのボタン、暗号化ツールのコマンドの例、暗号化は作った人を証明しないのでハッシュを確かめるという説明、アプリが開いた後のデータは端末の管理者が取り出せるという注意が表示されている。

ファイルを暗号化する

  1. 手順3ファイルを暗号化する

    暗号化の作業は、AIアシスタントに頼むのがいちばん簡単です。ファイル本体はあなたの手元で暗号化され、Usakeyには送られません。

    AIアシスタントに、次の指示文を貼り付けます。ファイル名や機能権限の名前は、実際のものに変えてください。

    UsakeyのMCPのスキルを使って、製品に同梱する models/pro.onnx を、ライセンスが有効な端末でだけ開けるように暗号化して。暗号化用の公開鍵は、この製品の画面でコピーした usakey-sealing-key:v1: で始まる1行(ここに貼る)を使って。プロ版のライセンスだけに開かせたいので、機能権限 pro_model を付けて、元のファイルの隣に models/pro.onnx.sealed として書き出して。元のファイルは配布物に入れないで。
  2. 手順4暗号化したファイルを製品と一緒に配布する

    暗号化したファイルを、インストーラやコンテナのイメージに入れて配布します。元のファイルは配布物に入れないでください。

    ファイルごとにランダムな鍵で暗号化するため、同じファイルでも暗号化するたびに別のファイルになります。暗号化し直したファイルを配ると、端末は最初に開くときに1回だけ鍵を受け取り直します。ビルドの仕組みに組み込む場合は、Rust・C ABI・Node.js・Python・RubyのSDKの暗号化の関数も使えます(同じ形式になります)。

製品アプリで開く

製品アプリへの組み込みも、AIアシスタントに頼むのがいちばん簡単です。製品アプリに認証を組み込むと同じ手順でAIアシスタントをつなぎ、次のように頼みます。ファイル名や機能権限の名前は、実際のものに変えてください。

UsakeyのMCPのスキルを使って、このアプリが models/pro.onnx.sealed をライセンスで開けるようにして。機能権限 pro_model がオンのときだけ読み込み、使えないときは標準のモデルに切り替えて理由を表示して

AIは、SDKの「暗号化したファイルを開く」関数で読み込む実装と、その確認のテストを作ります。対応しているのは、Rust・C ABI(C)・Node.js・Python・RubyのSDKです。ほかの言語のSDKは、まだ対応していません。SDKの関数は次のように動きます。

  • 開くたびに、いまのライセンスの判定を確かめ、使ってよいときだけ開きます。ファイルに機能権限の名前が付いていれば、その機能権限で判定します。
  • その端末でそのファイルを初めて開くときだけ、Usakeyと通信して鍵を受け取ります(Runtime APIの月間回数を1回使います)。受け取った鍵は端末に保存し、以後は通信せずに開きます。
  • SDKはファイルを開くための鍵をアプリに渡さず、開いたデータだけを返します。

自分で組み込むときの仕様は、開発者ドキュメントの「暗号化したファイルの鍵を受け取る」にあります。

例: 機械学習のモデルと前処理

学習済みの重みと前処理のパラメータ(特徴量の順序、平均・標準偏差、判定のしきい値など)を製品に同梱し、ライセンスが有効な端末の製品アプリでだけ読めるようにする例です。SDKの python/examples/sealed_model に、学習から暗号化、アプリでの読み込みと推論までを動かせる版があります(Pythonの標準ライブラリだけで動きます)。

  1. ビルドで暗号化する。重みと前処理をそれぞれファイルに書き出し、公開鍵で暗号化します。高精度のモデルには機能権限(例 pro_model)を付けます。配布物には .sealed だけを入れます。
  2. 平文のハッシュをアプリに埋め込む。同じビルドで、暗号化する前のファイルのSHA-256を計算し、アプリのコードに埋め込みます。ハッシュから重みは分かりません。公開鍵を知る人が作った偽のファイルは、開けてもハッシュが合わないので読み込みません。
  3. アプリはメモリ上で読む。SDKが返すデータをそのまま読み込み、ディスク・ログ・一時ファイルに書きません。バイト列から読める形式を選びます(ONNX Runtimeの InferenceSession(data)、safetensors、pickleを使わないNumPyの .npz、JSONなど)。
# 販売者のビルド(公開鍵だけで暗号化する)
usakey.seal_file(sealing_key, "model.onnx", "dist/model.onnx.sealed", entitlement="pro_model")
usakey.seal_file(sealing_key, "preprocess.json", "dist/preprocess.json.sealed")
print(hashlib.sha256(open("model.onnx", "rb").read()).hexdigest())  # アプリに埋め込む

# 製品アプリ(開いたデータを照合してから、メモリ上で使う)
model = client.open_sealed_file("dist/model.onnx.sealed")
if not hmac.compare_digest(hashlib.sha256(model).hexdigest(), MODEL_SHA256):
    raise RuntimeError("このアプリで作ったモデルではありません")
session = onnxruntime.InferenceSession(model)
  • 機能権限がオン(true)でないライセンスでは、高精度のモデルを開けません(Pythonでは LicenseDeniedError、理由は EntitlementMissing)。標準のモデルに切り替えて動かし続けられます。
  • pickleを使う形式(joblib、torch.load の既定など)は、暗号化したファイルから読まないでください。偽のファイルを読まされると、アプリの中で任意の処理を動かされるおそれがあります。
  • アプリが読み込んだ後の重みは、端末の管理者がメモリから取り出せます。重みそのものを端末に渡したくない場合は、推論をあなたのサーバーで行う構成にしてください。

完全オフラインの端末

インターネットにつながらない端末でも開けます。完全オフライン(Offline Activation)は、チーム以上のプランで使えます。

  • 端末で申請ファイル(.usakeyreq)を作るときに、暗号化したファイルを含めます(1回の申請で16件まで)。申請ファイルに入るのは、ファイルのヘッダーだけです。
  • 管理画面かManagement APIで利用ファイル(.usakeylic)を発行すると、それらのファイルの鍵が利用ファイルに入ります。1件でも鍵を渡せないファイルがあれば発行せず、理由を表示します(別の製品のファイル、機能権限がtrueでない、プランに含まれない など)。
  • 端末は利用ファイルを読み込んだあと、通信せずに開けます。あとから別のファイルを足すときは、申請ファイルを作り直して、利用ファイルを発行し直します。

申請ファイルと利用ファイルのやり取りは、開発者ドキュメントの「完全オフライン端末の手順」にあります。

開けないとき

製品アプリが受け取るコードと、確かめることです。どれも端末の認証は解除されません。

起きていること製品アプリが受け取るもの確かめること
ファイルに付けた機能権限が、そのライセンスでtrueになっていないSEALED_FILE_ENTITLEMENT_REQUIRED利用ルールかライセンスの機能権限に、同じ名前でtrueが入っているか
別の製品の公開鍵で暗号化した、途中で壊れた、書き換えられたSEALED_FILE_INVALIDこの製品の公開鍵で暗号化し直し、ファイルを入れ直す
Usakeyが一時的に鍵を渡せないSEALED_FILE_KEY_UNAVAILABLE時間をおいて開き直す
あなたの契約プランにファイルの暗号化が含まれていないPLAN_ENTITLEMENT_REQUIREDチームプラン以上に戻すと、同じ鍵で再び開けるようになる
ライセンスが一時停止・取消・期限切れ使えないという判定(LICENSE_SUSPENDED などのコードのこともある)開けないのが正しい動作です。一時停止はライセンスを再開すると、期限切れは期限を延ばすと、再び開けます(取消は元に戻せません)

Usakeyが鍵を渡さなかった要求は、管理画面でライセンスの端末を開くと「直近7日に断られた要求」に理由と回数が出ます。製品アプリが通信する前に止めたもの(別の製品のファイル、機能権限がtrueでない など)は出ないので、製品アプリが受け取ったコードや判定で確かめてください。

ファイルの暗号化を使えるプランは、料金ページの比較表で確かめられます。

画面はテスト環境で架空のデータを使って撮影しています。製品IDなどの識別子、ライセンスキー、認証トークンは伏せています。画面の細部は、改善に合わせて変わることがあります。