Discuss Scratch
- Discussion Forums
- » 日本語
- » セーブコードについてみんなで話し合う場所1
- goigoigun
- Scratcher
84 posts
セーブコードについてみんなで話し合う場所1
セーブコードは暗号化されているのは分かっていると思いますが、暗号化の仕方でいちばん簡単な方法はリストを使った方法です。
例えばA=1 D=4のような感じです。それぞれの文字をリストに追加し、セーブコードを作り上げています。(語彙力なくてすいませんm(_ _)m)
ロードするときはセーブコードの◯番目の文字をリストの中から番号を読み取り、ロードしています。(度々語彙力なくてすいませんm(_ _)m)
例えばA=1 D=4のような感じです。それぞれの文字をリストに追加し、セーブコードを作り上げています。(語彙力なくてすいませんm(_ _)m)
ロードするときはセーブコードの◯番目の文字をリストの中から番号を読み取り、ロードしています。(度々語彙力なくてすいませんm(_ _)m)
- inoking
- Scratcher
1000+ posts
セーブコードについてみんなで話し合う場所1
これは署名と呼ばれるもので投稿本文とは関係ありません。
Scratch は「世界最大の子ども向けコーディングコミュニティーで、シンプルなビジュアルインターフェースを持ったコーディング言語」
つまり「子ども SNS」ではない
・「傾向」とは単に一定の基準で作品を並びかえただけのもので、ランキングでもなんでもない、ナンバーワンよりオンリーワンを目指してみては?
・「フォロー」とは他の Scratcher が何をしているかを簡単に確認するためのもので、「フォロワー」は「ファン」ではない
・「スタジオ」とは特定のテーマに沿って作品をまとめたり、共同制作したりするための場所
・「星」や「ハート」などを何かの見返りとすることは Scratch チームによって禁止されている
- Jinenjo_000
- Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
>> #426
一般論となりますが、以下のような方法が考えられます。
・基数の大きな進数で表す
例えば10進数のセーブコードを1024進数に変換すると、桁数は3分の1くらいになります。
・ランレングス圧縮
繰り返しの多いデータで効果的です。
・ゼロ幅文字を使う
セーブコードの見かけの長さが短くなるので、コピペが楽になります。
一般論となりますが、以下のような方法が考えられます。
・基数の大きな進数で表す
例えば10進数のセーブコードを1024進数に変換すると、桁数は3分の1くらいになります。
・ランレングス圧縮
繰り返しの多いデータで効果的です。
・ゼロ幅文字を使う
セーブコードの見かけの長さが短くなるので、コピペが楽になります。
- so-so-egg_sub
- Scratcher
7 posts
セーブコードについてみんなで話し合う場所1
リンク切れ防止
100までの素数の中からランダムに選んでそれをかけてどこかに素数隠してまたランダムに他をを選んでそれを割ってまたどこかに隠す
100までの素数の中からランダムに選んでそれをかけてどこかに素数隠してまたランダムに他をを選んでそれを割ってまたどこかに隠す
失敗?誰が君が失敗したなんて言ったんだ
君がやったそれは失敗じゃない
成長のための糧だ
君がやったそれは失敗じゃない
成長のための糧だ
- Catapult-
- Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
セーブコードを絶対に改ざんされないようにする手順を考えました。(要サーバ)
①まず、クラウド変数を利用した独自通信プロトコルを作る。(長さとかハッシュとか宛先をヘッダにつけるなど)
②ユーザーができる動作を数値に置き換える。
③ユーザーが何かアクション起こすたびに、ユーザーはサーバのアカウントに向けてその動作を数値化したものを、先述のプロトコルで送信する。
④サーバは受け取った動作が正常であることを確認し、必要であればセーブコードを作成または書き換える。(簡単なデータベースも要ります。この辺はpythonやらjsやらでうまいことやる)
⑤新しいユーザーや再び訪れたユーザーに対して、サーバーは必要なセーブコードを送信する。
という流れです。この仕組みをベースに、ユーザーが決めたパスワードを利用した公開鍵暗号などを使えば、理論上は改ざんされることがなくなります。この方式は、独自プロトコルを作っている@daikonnbatakeさんとの議論の中で出たアイデアです。ただ、この方式はいわゆる「理論上可能」というもので、コストとかは考えてません。前の議論のように多少面倒くさくするだけで一定の不正防止効果は出ると思います。
①まず、クラウド変数を利用した独自通信プロトコルを作る。(長さとかハッシュとか宛先をヘッダにつけるなど)
②ユーザーができる動作を数値に置き換える。
③ユーザーが何かアクション起こすたびに、ユーザーはサーバのアカウントに向けてその動作を数値化したものを、先述のプロトコルで送信する。
④サーバは受け取った動作が正常であることを確認し、必要であればセーブコードを作成または書き換える。(簡単なデータベースも要ります。この辺はpythonやらjsやらでうまいことやる)
⑤新しいユーザーや再び訪れたユーザーに対して、サーバーは必要なセーブコードを送信する。
という流れです。この仕組みをベースに、ユーザーが決めたパスワードを利用した公開鍵暗号などを使えば、理論上は改ざんされることがなくなります。この方式は、独自プロトコルを作っている@daikonnbatakeさんとの議論の中で出たアイデアです。ただ、この方式はいわゆる「理論上可能」というもので、コストとかは考えてません。前の議論のように多少面倒くさくするだけで一定の不正防止効果は出ると思います。
- Jinenjo_000
- Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
その方法では、ユーザーがロードしようとしたセーブコードの正当性が保証されないのでは?
この部分が「サーバーが決めたパスワードを利用した公開鍵暗号(署名)」であれば理解できるのですが。 (前略)
この仕組みをベースに、ユーザーが決めたパスワードを利用した公開鍵暗号などを使えば、理論上は改ざんされることがなくなります。
(後略)
- Catapult-
- Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
>> #433
確かに、ユーザーが受け取ったセーブデータがサーバーから発行されたものかの検証まで考えてませんでした。申し訳ない…
それなら、セーブデータと同時にパスワードも暗号化して送るというのはどうでしょうか。
ユーザーはサーバーの公開鍵を使ってパスワードを送るので、そのユーザーとサーバー以外はパスワードを知らないはずです。
あとよくよく考えたら、クラウドAPI(Websocket)を利用すればユーザー名も偽装できてしまうので、そのサービス内でのユーザー名&パスワードという風に登録するのがよさそうですね。
「改ざん」は任意のユーザーが任意のユーザーのセーブデータを改変または削除することのつもりです。
いろいろ抜けてましたね。
確かに、ユーザーが受け取ったセーブデータがサーバーから発行されたものかの検証まで考えてませんでした。申し訳ない…
それなら、セーブデータと同時にパスワードも暗号化して送るというのはどうでしょうか。
ユーザーはサーバーの公開鍵を使ってパスワードを送るので、そのユーザーとサーバー以外はパスワードを知らないはずです。
あとよくよく考えたら、クラウドAPI(Websocket)を利用すればユーザー名も偽装できてしまうので、そのサービス内でのユーザー名&パスワードという風に登録するのがよさそうですね。
「改ざん」は任意のユーザーが任意のユーザーのセーブデータを改変または削除することのつもりです。
いろいろ抜けてましたね。
- Jinenjo_000
- Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
話している内容が違います。
あなたの案ではユーザー自身による、自分のセーブデータの改ざん(例えばステータスを強くする、アイテムを増殖する)を防げないと思う、と言っているのです。
————— 正常な動作 ———————–
初回ログイン時
ユーザー –(行動)–> サーバー(「行動」が正常か確認)
ゲーム終了
ユーザー <–(セーブコード S0)– サーバー
2回目ログイン時
ユーザー –(セーブコード S0)–> サーバー
ユーザー –(行動)–> サーバー(「行動」が正常かS0に基づいて確認) (S0 → S1 に書き換え)
ゲーム終了
ユーザー <–(セーブコード S1)– サーバー
—————————————————————-
というのがあなたの案だと思いますが、
———– 悪意あるプレーヤーの場合 ———
初回ログイン時
ユーザー –(行動)–> サーバー(「行動」が正常か確認)
ゲーム終了
ユーザー <–(セーブコード S0)– サーバー
2回目ログイン時
ユーザー –(セーブコード S0' (≠ S0))–> サーバー
ユーザー –(行動)–> サーバー (「行動」が正常かS0'に基づいて確認)(S0' → S1' に書き換え)
ゲーム終了
ユーザー <–(セーブコード S1')– サーバー
———————————————————————–
このとき S0 ≠ S0' であることを判別できなければ、不正なゲームデータに書き換えられてしまいます。
これを防ぐには、そのセーブコードがサーバーから正当に発行されたものであることを検証し、ユーザーが不正に生成したセーブコードを拒否する必要があります。対策の具体例として私は「セーブコードにサーバーのデジタル署名をつける」というのを先の投稿で挙げました。
——————- 不正対策の一例 ——————-
初回ログイン時
ユーザー –(行動)–> サーバー (「行動」が正常か確認)
ゲーム終了
ユーザー <–(セーブコード S0 + S0に対する署名)– サーバー
2回目ログイン時
ユーザー –(セーブコード S0' + S0に対する署名)–> サーバー
署名が S0' に対して発行されたものではない
→S0の改ざんを検出したので、それ以降の動作を行わない
———————————————————————–
あなたの案ではユーザー自身による、自分のセーブデータの改ざん(例えばステータスを強くする、アイテムを増殖する)を防げないと思う、と言っているのです。
————— 正常な動作 ———————–
初回ログイン時
ユーザー –(行動)–> サーバー(「行動」が正常か確認)
ゲーム終了
ユーザー <–(セーブコード S0)– サーバー
2回目ログイン時
ユーザー –(セーブコード S0)–> サーバー
ユーザー –(行動)–> サーバー(「行動」が正常かS0に基づいて確認) (S0 → S1 に書き換え)
ゲーム終了
ユーザー <–(セーブコード S1)– サーバー
—————————————————————-
というのがあなたの案だと思いますが、
———– 悪意あるプレーヤーの場合 ———
初回ログイン時
ユーザー –(行動)–> サーバー(「行動」が正常か確認)
ゲーム終了
ユーザー <–(セーブコード S0)– サーバー
2回目ログイン時
ユーザー –(セーブコード S0' (≠ S0))–> サーバー
ユーザー –(行動)–> サーバー (「行動」が正常かS0'に基づいて確認)(S0' → S1' に書き換え)
ゲーム終了
ユーザー <–(セーブコード S1')– サーバー
———————————————————————–
このとき S0 ≠ S0' であることを判別できなければ、不正なゲームデータに書き換えられてしまいます。
これを防ぐには、そのセーブコードがサーバーから正当に発行されたものであることを検証し、ユーザーが不正に生成したセーブコードを拒否する必要があります。対策の具体例として私は「セーブコードにサーバーのデジタル署名をつける」というのを先の投稿で挙げました。
——————- 不正対策の一例 ——————-
初回ログイン時
ユーザー –(行動)–> サーバー (「行動」が正常か確認)
ゲーム終了
ユーザー <–(セーブコード S0 + S0に対する署名)– サーバー
2回目ログイン時
ユーザー –(セーブコード S0' + S0に対する署名)–> サーバー
署名が S0' に対して発行されたものではない
→S0の改ざんを検出したので、それ以降の動作を行わない
———————————————————————–
Last edited by Jinenjo_000 (May 24, 2023 03:24:23)
- Catapult-
- Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
すみません、#430の説明が不足していました。
私の案では、サーバーはセーブコードを発行しユーザーに提供するのではなく、サーバーそのものにセーブデータを保存することを考えていました。ユーザーはセーブコードを保管するのではなく、システム利用時にサーバーからクラウド変数で取得するイメージです。セーブデータのことをセーブコードを表記したため誤解を生んでしまいました。
#433の指摘では「サーバーに成りすました第三者からの不正なパスワードが届く可能性」についてだと思い、サーバー側からも認証情報をつけるべきかと思っていました。
ユーザーにデータを任せると完璧な不正対策はできないと思い込んでいましたが、ユーザーが知りえない情報を加えることで実現できそうですね。(ただし完璧にするためには常時サーバーが監視する必要はある)
そもそもここはセーブコードについてのトピックだったので、少し場違いな投稿でした。一連の投稿に関して、すみません。
私の案では、サーバーはセーブコードを発行しユーザーに提供するのではなく、サーバーそのものにセーブデータを保存することを考えていました。ユーザーはセーブコードを保管するのではなく、システム利用時にサーバーからクラウド変数で取得するイメージです。セーブデータのことをセーブコードを表記したため誤解を生んでしまいました。
#433の指摘では「サーバーに成りすました第三者からの不正なパスワードが届く可能性」についてだと思い、サーバー側からも認証情報をつけるべきかと思っていました。
ユーザーにデータを任せると完璧な不正対策はできないと思い込んでいましたが、ユーザーが知りえない情報を加えることで実現できそうですね。(ただし完璧にするためには常時サーバーが監視する必要はある)
そもそもここはセーブコードについてのトピックだったので、少し場違いな投稿でした。一連の投稿に関して、すみません。
- Mario-098
- Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
↓ここから下は署名です。いちいち手動で書いているわけではありません。
トピック・scratch内ですべての文字を描画することについて
#ScratchInScratchProject
html pleyer 作ってます(https://scratch.mit.edu/projects/863871016/)。開発中です。
最終更新2024年1月8日 @Mario-098 No Flash version detected