セキュア変数
はじめに¶
このページでは、Herculesのセキュア変数機能について説明します。
 セキュア変数機能を使用する前に、まずHive SDKを設定する必要があります。
 セキュア変数には以下の特徴があります:
- それは外部ツールによって取得できないようにメモリ内に暗号化された値です。
- 暗号化された値が改ざんされていても、読み取られるときに検証されます。
- サポートされている言語にはC/C++およびC#(Unity)が含まれます。
セキュア変数の使い方¶
C# (Unity)¶
- 基本的に、C#で利用可能なデータ型はジェネリッククラスとして使用できます。
- 各データ型に対応する安全なデータ型は次のとおりです。
- すべての基本型は8バイト型にキャストされるため、intの代わりにlongを、floatの代わりにdoubleを使用するなど、8バイト型を使用することをお勧めします。
| 基本型 | セキュア型 | 基本型 | セキュア型 | 
|---|---|---|---|
| bool | HerculesVar<bool> | int | HerculesVar<int> | 
| char | HerculesVar<char> | uint | HerculesVar<uint> | 
| sbyte | HerculesVar<sbyte> | long | HerculesVar<long> | 
| byte | HerculesVar<byte> | ulong | HerculesVar<ulong> | 
| short | HerculesVar<short> | float | HerculesVar<float> | 
| ushort | HerculesVar<ushort> | double | HerculesVar<double> | 
| string | HerculesString | 
// 以下の2つのコードは同じことを行い、新しいオブジェクトを割り当てます。
HerculesVar x = 100;
HerculesVar y = new HerculesVar(100);
// 値はセキュア変数から通常の変数にコピーされます。
int a = x;
// y に割り当てられていた古いオブジェクトは解放され、新しいオブジェクトが y に再割り当てされます。
y = 300;
// y の値を変更します。(y はすでにオブジェクトに割り当てられている必要があり、このタイプの割り当ては上記のものよりも高速です。)
y.Set(300);
// yはxの値として再代入されます。xとyは、元のxに割り当てられたオブジェクトとは異なるオブジェクトを参照し始めます。   
y = (int)x;
// 注意: y は x を参照します。Set 関数を使用すると、両方の値が置き換えられます。
// 符号なし型のセキュア変数を直接操作する際にビルドエラーが発生した場合
// 定数の後に U を指定するか、明示的なキャストを使用する必要があります。(1U または (uint)1 のように)
// 頻繁に更新される値については、パフォーマンス向上のために obj.Set(v); 形式で使用することが有利です。
y = x;
// 文字列はこのように使用できます: メモリ内の文字列のみが保護されています。
// “TEST”のような静的文字列を割り当てると、元の文字列がコードに露出する可能性があります。
HerculesString securityString = <サーバーからダウンロードされた文字列値または動的に生成された>;
string plainString = securityString;
iOS、Android¶
- Cの場合、変数の値を保存または読み取るたびにAPIを直接呼び出す必要があるため、C++を使用することをお勧めします。C++にはテンプレートクラスが定義されています。
- 可能であれば、セキュア変数をグローバル変数として使用するか、割り当てと解放があまり頻繁に行われない場所に配置してから使用することをお勧めします。
- extern "C" ブロック内にインクルード文を置かないでください。
- Hive SDKが初期化された後に使用する必要があります。
#include "Hercules.h"
class CUserInfo {
public:
    CHercules hp;
    CHercules mp;
    CHercules critical;
};
// グローバル変数として使用される場合、Hive SDK が初期化される前に変数の初期化が試みられるため、問題が発生します。
// CHercules g_temp;
// グローバル変数として使用する場合は、次のようにポインタの形式で宣言します。
CUserInfo *g_user;
CHercules *g_var;
CHerculesString *g_string;
void BeginBattle() {
    // セキュアな変数を作成します。 (例: ゲームのバトル開始時に)
    g_user = new CUserInfo;
    g_var = new CHercules;
    g_string = new CHerculesString(<サーバーからダウンロードされた文字列値または動的に生成された>);
}
void EndBattle() {
    // セキュア変数を削除します。(例: ゲームのバトル終了時)
    delete g_user;
    delete g_var;
    delete g_string;
    g_user = nullptr;
    …
}
void Sample()
{
    // 割り当ては以下のように任意の形式で行うことができます。
    int localvar = 0;
    CHercules x = localvar;
    *g_var = localvar;
    *g_var = x + 2;
    g_user->hp = 100;
    // “TEST”のような静的文字列を割り当てると、元の文字列がコードに露出する可能性があります。
    CHerculesString localString1 = <サーバーからダウンロードされた新しい文字列または動的に生成された>; // 文字列に初期化
    CHerculesString localString2 = *g_securityString; // CHerculesStringオブジェクトに初期化
    std::string localString = *g_securityString; // CHerculesStringをstd::stringに
    localString2 = localString1; // CHerculesStringからCHerculesStringへ
    localString1 = localString.c_str(); // std::stringからCHerculesStringへ
}
#include "Hercules.h"
HERCULES g_x;
HERCULES g_y;
HERCULES g_str;
void StartApp() {
    // セキュアな変数を作成します。
    // 基本的な型や構造体の変数を置くことで使用できます。
    int var = 0;
    g_x = HerculesAddVar(&var, sizeof(var));
    g_y = HerculesAddVar(&var, sizeof(var));
    // “TEST”のような静的文字列を割り当てると、元の文字列がコードに露出する可能性があります。
    g_str = HerculesAddString(<サーバーからダウンロードされた文字列または動的に生成された文字列>);
}
void Sample()
{
    // xの値を取得してyに格納します。この時、各関数で設定された2番目のパラメータは
    // HerculesAddVarを呼び出す際に設定したサイズと同じサイズの変数でなければなりません。
    int var;
    HerculesGetVar(g_x, &var);
    HerculesSetVar(g_y, &var);
    // セキュアな文字列を通常の文字列として取得した後、HerculesFreeMem関数で解放する必要があります。
    char *str = HerculesGetString(g_str);
    HerculesFreeMem(str);
    // 新しい文字列変数を割り当てる前に、HerculesRemoveVar関数を使用して削除する必要があります。
    HerculesRemoveVar(g_str);
    g_str = HerculesAddString(<サーバーからダウンロードされた新しい文字列または動的に生成された>);
}
参照 (C++)¶
- 変数が値で初期化されているときに使用します。 (オブジェクトが割り当てられている状態)
- 必要な計算がすべて完了した後に生成される最終結果を割り当てるために使用します。
- 以下の例を参照してください。 (C++には演算子のオーバーロードがあります。)