Discuss Scratch
- kunisan19go
-
Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
なるほどなんでセーブコードって暗号化するの?例えば、HP100 MP50 お金600 の状態でセーブをしたとき、100/50/600のようにセーブコードにするとします。
ロードするときに、これをそのまま入力すれば、同じ状態から再開できるわけです。
しかし、数値を見て、どの場所にある数値が何のステータスか大体予想できませんか?
そこで、ロードするときに、500/500/10000と入力してみましょう。
プログラムは、これが改ざんされた数値かを検出できないので、そのままロードします。
ずるができるわけです。
それを阻止するために、セーブコードを出力するときに暗号化して、どこがどのステータスに対応しているかわからなくするのが暗号化です。
- choriss55
-
Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
①中を見なければ解読できないレベルのセーブコードを生成
②ユーザー名をコード化する(A→01,B→02など)(A→89,B→42とランダムでもなんでも)
③オーバーフロー対策掛け算を使って①と②を掛け算して
④最後に③を111や999などで割ったりしてチェックデジットを③の後に付け加えれば
その人しか使えないし多少読まれて改ざんされてもチェックデジットが違ったりしたら不正を出せばチートは防げるかな。
②ユーザー名をコード化する(A→01,B→02など)(A→89,B→42とランダムでもなんでも)
③オーバーフロー対策掛け算を使って①と②を掛け算して
④最後に③を111や999などで割ったりしてチェックデジットを③の後に付け加えれば
その人しか使えないし多少読まれて改ざんされてもチェックデジットが違ったりしたら不正を出せばチートは防げるかな。
- NT_ZZzz
-
Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
不正なセーブコードを使用する方法として 主に
1.不正な状況でセーブをする(出力の不正)
2.自力でセーブコードを作成する(入力の不正)
の2つがあると考えられます
どちらも「中を見る」により行われるため、クラウド変数にセーブすることで対策ができます
入力の不正は中を見なくてもできなくはないかもしれない
そもそもユーザーにコードを渡す時点で改竄を防げる気がしないのですが
「ユーザーがセーブコードを改変できる」状態で
改竄を防ぐことは可能なのでしょうか?全く方法が思いつきません
1.不正な状況でセーブをする(出力の不正)
2.自力でセーブコードを作成する(入力の不正)
の2つがあると考えられます
どちらも「中を見る」により行われるため、クラウド変数にセーブすることで対策ができます
入力の不正は中を見なくてもできなくはないかもしれない
そもそもユーザーにコードを渡す時点で改竄を防げる気がしないのですが
「ユーザーがセーブコードを改変できる」状態で
改竄を防ぐことは可能なのでしょうか?全く方法が思いつきません
- inoking
-
Scratcher
1000+ posts
セーブコードについてみんなで話し合う場所1
先に書いたように、
ロード処理を作った時点で改ざんによるチートは容易です。
ただ、クラウド変数を使うことにより
プログラムが改ざんされていないことの確認はできるでしょう。
あらためて、
何を防ぎたいかを明確にしたほうがよいと思います。
なお、
可読性を落とすために変数名を変えるといったことは想定していません。
ロード処理を作った時点で改ざんによるチートは容易です。
ただ、クラウド変数を使うことにより
プログラムが改ざんされていないことの確認はできるでしょう。
あらためて、
何を防ぎたいかを明確にしたほうがよいと思います。
なお、
可読性を落とすために変数名を変えるといったことは想定していません。
- RITORUDX3
-
Scratcher
27 posts
セーブコードについてみんなで話し合う場所1
チートを防ぐのにクラウドセーブを使うのは容易なのでしょうか…?
クラウド変数でセーブするという方法があんまりわかりません…
クラウド変数でセーブするという方法があんまりわかりません…
- watashida
-
Scratcher
500+ posts
セーブコードについてみんなで話し合う場所1
私も比較的強いクラウド変数を用いたチート対策を考えたことがあります。
ハッシュ関数を使うことである程度多くの人数のデータを保存することができます。
ハッシュ長を16桁とすればセーブできる人数は160人で衝突する可能性もかなり小さくできます。
セーブデータ = 単純なセーブデータとすることでプレイヤーにセーブデータを保管させ、クラウド変数にそのハッシュを保管します。
(セーブデータ) を表示する
ハッシュ = hash(セーブデータ)
(クラウドリスト) に (ハッシュ) を追加する
セーブデータ = 入力(セーブデータ)セーブデータを偽造した場合クラウドリストにハッシュが入っていないため、そのことを検知することができます。
ハッシュ = hash(セーブデータ)
もし (ハッシュ) が (クラウドリスト) に入っているなら
(クラウドリスト) から (ハッシュ) を削除する
(成功) を表示する
でなければ
(失敗) を表示する
ハッシュ関数を使うことである程度多くの人数のデータを保存することができます。
ハッシュ長を16桁とすればセーブできる人数は160人で衝突する可能性もかなり小さくできます。
- RITORUDX3
-
Scratcher
27 posts
セーブコードについてみんなで話し合う場所1
私も比較的強いクラウド変数を用いたチート対策を考えたことがあります。クラウドリストはどうやって作るんですか?リストにクラウド機能はないと思うんですが…セーブデータ = 単純なセーブデータとすることでプレイヤーにセーブデータを保管させ、クラウド変数にそのハッシュを保管します。
(セーブデータ) を表示する
ハッシュ = hash(セーブデータ)
(クラウドリスト) に (ハッシュ) を追加するセーブデータ = 入力(セーブデータ)セーブデータを偽造した場合クラウドリストにハッシュが入っていないため、そのことを検知することができます。
ハッシュ = hash(セーブデータ)
もし (ハッシュ) が (クラウドリスト) に入っているなら
(クラウドリスト) から (ハッシュ) を削除する
(成功) を表示する
でなければ
(失敗) を表示する
ハッシュ関数を使うことである程度多くの人数のデータを保存することができます。
ハッシュ長を16桁とすればセーブできる人数は160人で衝突する可能性もかなり小さくできます。
- YY04
-
Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
私も比較的強いクラウド変数を用いたチート対策を考えたことがあります。「ハッシュ」って、バーコードにも使われているやつですよね。セーブデータ = 単純なセーブデータとすることでプレイヤーにセーブデータを保管させ、クラウド変数にそのハッシュを保管します。
(セーブデータ) を表示する
ハッシュ = hash(セーブデータ)
(クラウドリスト) に (ハッシュ) を追加するセーブデータ = 入力(セーブデータ)セーブデータを偽造した場合クラウドリストにハッシュが入っていないため、そのことを検知することができます。
ハッシュ = hash(セーブデータ)
もし (ハッシュ) が (クラウドリスト) に入っているなら
(クラウドリスト) から (ハッシュ) を削除する
(成功) を表示する
でなければ
(失敗) を表示する
ハッシュ関数を使うことである程度多くの人数のデータを保存することができます。
ハッシュ長を16桁とすればセーブできる人数は160人で衝突する可能性もかなり小さくできます。
いろいろ計算した結果、ハッシュ値と同じになったかで偽造を防ぐっていう…
- choriss55
-
Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
クラウドリストはどうやって作るんですか?リストにクラウド機能はないと思うんですが…準備
①クラウド変数を作ります
②漢字やひらがなはチャット機能とみなされてしまうのでアルファベットと数字、アカウントに使える記号をかき出します
③その文字一つ一つをリストに入れます(これはクラウドリストではない)
④改行コードは00とします
コード化
①コード化したい文字数だけ繰り返す
コード化させたい文字を準備の時にリストにぶち込んだ文字の中から探します
②①の結果をクラウド変数につなげます(改行させたいところに00を入れます)
戻す
①00だったら新しい箱を作ったり01だったら準備で作ったリストから探します
※2文字ずつ読み込みます
詳しくはここ
- choriss55
-
Scratcher
100+ posts
セーブコードについてみんなで話し合う場所1
削除
Last edited by choriss55 (Oct. 17, 2019 11:02:24)
- inoking
-
Scratcher
1000+ posts
セーブコードについてみんなで話し合う場所1
プログラムの改ざん回避については
誰かがどこかで同じプロジェクトを実行している必要はありますが
「作品を開いている間に別のアカウントがクラウド変数を操作すること」を確認すれば
エディター画面で操作されていないことは保証できます。
そのうえで、チート対策として
私も今日デジタル署名の方式で #92 と同様なことを考えていました。
それ以前に、
セーブデータをすべてクラウドに保存してしまえばそれで事足りますけどね。
誰かがどこかで同じプロジェクトを実行している必要はありますが
「作品を開いている間に別のアカウントがクラウド変数を操作すること」を確認すれば
エディター画面で操作されていないことは保証できます。
そのうえで、チート対策として
私も今日デジタル署名の方式で #92 と同様なことを考えていました。
でもハッシュで十分ですね。セーブデータ = 秘密鍵で暗号化とすることでプレイヤーにセーブデータと公開鍵を保管させ、クラウド変数にその公開鍵を保管します。
(セーブデータ) と (公開鍵) を表示する
(クラウドリスト) に (公開鍵) を追加するセーブデータ = 入力(セーブデータ)セーブデータを偽造した場合クラウドリストに公開鍵が入っていないため、そのことを検知することができます。
公開鍵 = 入力(公開鍵)
もし (公開鍵) が (クラウドリスト) に入っているなら
(クラウドリスト) から (公開鍵) を削除する?
(成功) を表示する
(セーブデータ) を公開鍵で復号化
でなければ
(失敗) を表示する
クラウドが公開鍵の認証局の役割を果たすわけです。
それ以前に、
セーブデータをすべてクラウドに保存してしまえばそれで事足りますけどね。
- RITORUDX3
-
Scratcher
27 posts
セーブコードについてみんなで話し合う場所1
改行コードとかって何ですかね?作品を見てみてもあんまりわからなくて…クラウドリストはどうやって作るんですか?リストにクラウド機能はないと思うんですが…準備
①クラウド変数を作ります
②漢字やひらがなはチャット機能とみなされてしまうのでアルファベットと数字、アカウントに使える記号をかき出します
③その文字一つ一つをリストに入れます(これはクラウドリストではない)
④改行コードは00とします
コード化
①コード化したい文字数だけ繰り返す
コード化させたい文字を準備の時にリストにぶち込んだ文字の中から探します
②①の結果をクラウド変数につなげます(改行させたいところに00を入れます)
戻す
①00だったら新しい箱を作ったり01だったら準備で作ったリストから探します
※2文字ずつ読み込みます
詳しくはここ