チカラの技術

電子工作やプログラミング

【VRChat】ワールドギミック作成TIPS【U#】

ギミック作成時のTIPSや不具合対策が溜まってきたのでまとめます。
VRChatの開発環境は絶えず更新されていくため情報が古くなっている可能性があることはご留意ください。
(ご指摘のコメントお待ちしています)

UdonSharp (U#)

Class Exposure Tree

U#で使用できるビルドインのC#クラスを確認できます。
ビルトインメソッドはU#よりも遥かに高速なのでパフォーマンスが向上します。


使用できるクラスは緑色、使用できないクラスは赤色で示されます。
]

公式ドキュメント
Class Exposure Tree | UdonSharp

不具合対策:同期変数の初期化待ち

2022年末頃からジョイン時の同期変数の初期同期が完了するまでstart()から10秒程掛かるようになっています。
その前に同期変数を操作するとギミックが壊れる可能性があるため、ギミックは同期待ち処理が必要です。

続きを読む

【VRChat】UdonJwtの使い方【改ざん対策】

本記事はVRChatで利用できるJwtライブラリの「UdonJwt」の解説記事になります。

想定読者:Downloading系APIを利用するギミックを制作していてローカルの改ざんを防止したい人。

本記事は導入方法の解説がメインですのでU#とJWTについての基礎知識は前提となりますのでご了解ください。
(ハッキリ言って普通のU#ギミックより難しいです。ギミックの特性上必要な構造なので・・・)

概要

UdonJwtは公開鍵署名検証を実現するU#ライブラリです。
作者はkoyashiroさん (koyashiro (@koyashiro) / Twitter)。

主な仕様:

  • 公開鍵でトークンの署名を検証します。秘密鍵で署名する機能は実装されていません。
  • 署名アルゴリズムはRS256 [鍵長2048bit] のみサポート。他のアルゴリズムの指定はエラーとなります。
  • 公開鍵はpem形式の文字列を受け付けます。
  • トークンに'exp' payloadを持つ場合、VRChatのサーバー時間APIを使用してトークンの有効期限を検証します。
  • 現在のバージョンはV0.1.5

改ざん対策としてUdonJwtを利用する場合のシステム構成図を示します。


用途例: Donwloading系APIのデータ改ざんを拒否できる。(現在、中間者攻撃が確認されています。詳細は前回の記事を参照ください。)
注意点: 現状のUdonの処理速度が遅いため、署名検証処理に数秒掛かる。データが大きい場合はハッシュ化して利用するなど工夫が必要。
     (図ではトークンにハッシュを入れてデータと分けて送っている)

続きを読む

【VRChat】Discordメンバーのみ自動開錠する鍵ギミックを作りました【無料配布】

こんにちは、元気です!

今回も鍵ギミックの制作と配布ですが、VRChatの新機能のおかげで過去最高のものが出来ました!

本記事の構成

  • ギミックの紹介と配布
  • ギミックの仕組み解説
  • セキュリティ対策 (中間者攻撃や改ざん対策など)

それでは行ってみましょう!

ギミック概要

Udonで出来たオートロック、UdonAutoLockです!


概要はDiscordを日常的に利用する方ならこの画像一枚で分かると思います。



VRChat側:
ワールド入室後10秒で自動開錠します。操作不要なのでこれ以上簡単になりようがないですね!
開錠したメンバーは操作パネルで同インスタンスの人を開錠できます。(機能有効時)



Discord側:
VRChat名の登録はメンバー本人にして頂くため、discordサーバー管理者は開錠させたいメンバーにロールを付与するだけです。
登録後は約1分でワールドに反映されます。もちろんワールドの更新は不要です。

セキュリティ機能:
開錠データは難読化(ハッシュ化)されます。
また後述しますが偽の開錠データを防ぐ機能なども備わっています。

その他、ギミックの設定やbotの運用方法は配布物のマニュアルを確認して頂ければと思います。

配布先

ギミック

配布先はこちらです。

booth.pm


マニュアル付属で記事を読まなくても使えます。是非使って頂ければ!
またギミックのライセンスはCC0で自由に改変・再配布可能です。

※ VRChat公式のモデレートガイドラインの対応については導入マニュアルの序章に記載しています。

Discord-bot

公開botを用意していますのでそちらをDiscordサーバーに導入して頂く形になります。
(導入URLはギミック同梱のマニュアルに)

さらに自分でbotを運用したい方のためにbotのコードもGitHubにてCC0で公開しています。

github.com


(なおbotはwebsocketで接続するので運用に固定グローバルIPアドレスは不要です。)

実績:
本ギミック及びbotは開錠メンバー200人以上のDiscordサーバーで10日前からテスト運用され基本的なバグは修正済みです。

デモ・サポートサーバー:
こちらのDiscordサーバーでUdonAutoLockのデモ体験や技術サポートを行っているので良ければ!(入退室自由です)
discord.gg

続きを読む

【VRChat】リッピングでパスワードギミックが破られるので公開鍵を利用した対策品を作りました【無料配布】

こんにちは! 本記事はVRChatのワールド向けパスワードギミックの紹介・配布記事になります。

まず結論から:要点とギミック配布

従来のパスワードギミックはリッピング(VRChatのデータを不正にダウンロードする行為)によってパスワードが簡単に抜かれてweb上に公開され、誰でも開錠可能になってしまうことが分かりました。

今回その対策としてJWT(公開鍵を利用した検証技術)による新しいパスワードギミックを作成しました。ワールドデータにパスワードを置かないためリッピング耐性があります。従来のパスワードギミックの置き換えとして使用でき、オプションでパスワードの漏洩対策もできます。


こちらで無料配布しています。(MITライセンスで改変・再配布可能です)

power-of-tech.booth.pm
※ VRChat公式のモデレートガイドラインの対応についてはマニュアルの序章に記載しています。

ワンタイムパスワードシステムも新ギミックで稼働します。こちらのサーバーがデモと利用申請の窓口になります。(10名まで)
discord.gg

2023年03月11日11:20 追記:利便性の向上のためワンタイムパスワードシステムはUdonAutoLockに切り替えています。以下ご確認ください。
【VRChat】Discordメンバーのみ自動開錠する鍵ギミックを作りました【無料配布】 - チカラの技術

本ギミックのコアライブラリ(UdonJwt)はkoyashiroさんに作成して頂きました。
https://twitter.com/koyashiro

詳細:開発経緯と技術解説

本記事は経緯と技術説明を交互に行う構成になっています。興味のある見出しを見てもらえればと思います。(もちろん読まなくても配布ギミックは使えます)

経緯①:公開初日にワンタイムパスワードシステムが破られた

今から約1カ月半前、ワンタイムパスワードシステム(以下OTP)の記事とデモを公開しました。(本記事の理解にはタイトルだけ見れば大丈夫です)

power-of-tech.hatenablog.com

そして公開からわずか数時間後に続々と報告が・・・

秘密鍵ってこれですよね?

・・・それです。

続きを読む

【VRChat】Discordメンバーのみ開錠できるワンタイムパスワードロックを作りました。【無料】

こんにちは!元気です。

今回はVRChatのワールドギミックの解説と導入提案(無料)の記事になります。

一般の方向けの用語解説などはありませんのであしからず・・・!

VRChatの鍵の技術

良い感じの鍵、欲しくないですか?


[ 画像:VOLT Dance Club / DigitrevX様 (※パスワードは無いです)]

VRChatのワールドで特別な部屋にロックを掛けたい場合、鍵が必要になります。

今回作ったワンタイムパスワードロックシステム(OTP方式)は現行手法のデメリットを軽減もしくは解決する目的で作りました。

ただ現行手法にもメリット・デメリットがあるため、まずはそれらを紹介します。


なお、VRChat公式のモデレートツールガイドライン(規約に準ずる)についても後述で触れます。

現行手法

主に3つの手法があります。

① 固定パスワード方式:

ワールド製作者が決めた秘密のパスワードをパスした人のみアンロック。


メリット:
メンバーの増減に関係なく、パスワードを通知されたメンバー全員がアンロックできます。

デメリット:
セキュリティが他方式と比べて低いです。総当たり攻撃でパスを攻略されて、掲示板などでワールドURLと共に公開されてコンテンツが不特定多数に漏洩してしまうことがあります。実例を何件も見ました。 (メンバーが漏洩した可能性も排除できないので精神衛生上も良くないですね)

② ホワイトリスト方式:

VRChatのユーザー名でホワイトリストを作って対象のみアンロック。


VRChatのワールドに入場したプレイヤー自身のディスプレイネームはAPI(Networking.LocalPlayer.displayName)を用いて取得することができ、それとホワイトリストと照合してアンロックする仕組みです。
ディスプレイネームはVRChat上で一意(重複しない)のためホワイトリストに無い人が名前をなりすましてアンロックすることはできません。

メリット:
パスワードが存在せず入力の手間がありません。また漏洩の問題も無くセキュアです。

デメリット:
ホワイトリストの更新の都度ワールドを再アップロードするため、メンバーの増減に対してワールド製作者の負担が掛かること、また即応性の問題があります。小規模のコミュニティ向けといえます。(ただUnityでのリスト更新とワールドのアップロードを定時実行するよう自動化できれば負担に関してはこの限りではありません)

③ 動画プレイヤー方式:

VRChatのユーザー名でホワイトリストを作り、シリアライズ→画像→動画にエンコードしてアップロード、VRChat上で動画プレイヤーからカメラで画像を取得してホワイトリストにデコード、アンロック。


VRC名の収集と動画エンコード、サーバーアップロードの自動化部分は実装難度高めです。(自動化しないと②の手法のワールド更新の手間との比較になります)中~大規模のコミュニティ向きと言えます。

文字列の動画取得についての技術はこちらの記事で紹介されています。

【VRCAdvent Calendar】VRChatへ外部から文字列を渡すよ(C# only) - 神城デジタル事務所

メリット:
パスワードが存在せずセキュアで入力の手間がありません。またメンバー増減の反映は動画の更新で行えるのでワールドの再アップロードが不要です。

デメリット:
動画プレイヤーは仕様のアップデートが多く対応のためにワールド更新が必要なことがあります。またUntrustedなURLを避ける場合はyoutubeなどのアップロード頻度の制限からメンバー増減の即応性が遅れる場合があります。さらに動画プレイヤーはまれに読み込みを失敗するため安定動作のためには実装に工夫が必要です。

ホワイトリスト方式のギミック配布

先に挙げたホワイトリスト方式ですがメンバーがほとんど増減しない用途で有ればシンプルかつ強固で有効です。この用途ではOTP方式よりも適しているためギミックを作りました。良ければお使いください。

www.dropbox.com

なお、VRChat公式のモデレートガイドラインの対応については配布物のマニュアルの序章に記載しているので気になる方はご参照ください。同様の内容をOTPの運用マニュアルにも記載しています。

OTP方式:

今回作成したOTP方式は中~大規模のコミュニティに適します。

メンバーはアンロックの際、discordのbotからパスワード(PIN)を取得してVRChatで入力し開錠します。 メンバーの増減は自動で即時反映され、ワールド再アップロードの必要はありません。

続きを読む

【公式回答】Zennはハードウェア系の記事が投稿できる

こんにちは!  本質情報としては表題以上のことはありません! 

…が!より詳しくはこのままお付き合い願います!

背景:Qiitaでハードウェア記事は対象外

先日Qiitaはコミュニティ内のエンジニアの定義を「プログラミングの知識と経験を活用している人」としました。

f:id:powerOfTech:20210419221408p:plain:w300

blog.qiita.com

様々な解釈はありますが、基本的にはQiitaはハードウェア系の記事投稿を希望しないと捉えられます。

ただ元々Qiitaはこのような傾向だったので、今回それが明文化されただけだとも言えます。

(数年前に私がQiitaの方に伺って同様の回答を頂いたので、私はこのはてなブログに記事を投稿するようになりました)

ZennはOK!

そこで他の技術記事を専門とする投稿サイトの一つとして挙げられるのがZennです。 f:id:powerOfTech:20210419223332p:plain:w400

技術記事の投稿のほか、技術情報をまとめた本をサイト上で配布・販売できたり投稿者への金銭的サポートを行う機能があるのが特徴です。

zenn.dev

全体的に非常に良さそうです。

ただ、webサイト記載の情報からは投稿者たるエンジニアの定義についての記載がなく、また実際に投稿されている記事はほぼ全てがソフトウェア系でした。

そこでZennサポート様へ問い合わせをして、本日ご回答を頂いたので以下に原文のまま転載します。(転載許可は頂いています)

続きを読む

【電池BOX】 うずまきバネ式の抵抗は板バネ式の数十倍大きい

お久しぶりです、元気です!

結論から

単三乾電池4本の電池BOXにおいてうずまきバネ式の抵抗は0.4Ω程度あり、板バネ式の20倍程度でした。

電池電流が4Aのとき、うずまきバネ式の損失は6.4Wに達し使用する負荷の半分が電池BOXで熱として消費されてしまうため、モーター駆動など2Aを超える高負荷の用途には板バネ式を使用する必要があると判断します。

f:id:powerOfTech:20201123134926j:plain

うずまきバネ式の電池BOXの抵抗の内訳:

※記事執筆後に指摘を受け抵抗の主因について調べた結果、バネの接触抵抗ではなかったため一部追記修正しています。

経緯

私は現在モータードライバーの設計中をしているのですが、これは単三電池4本から4V / 4A程度の出力を取り出す仕様にしています。

現在、digikeyなどのサイトで入手できる8割方の電池ボックスはマイナス端子がうずまきバネ式なのですが、負荷を掛けたときの電圧降下が大きく設計値を満たせないことから、今回板バネ式の電池ボックスと計測・比較しました。

電圧降下の計測

条件:電子負荷を用いて各負荷電流のときの電池BOXの金属端子間の電圧を測定する。

   ※使用している電池BOXは全て新品、乾電池は同じ単3型eneloop(ニッケル水素電池)を使用しています。

結果グラフ: f:id:powerOfTech:20201123141531p:plain

続きを読む