ココア アプリケーションの試用部分を作成しようとしています。ライセンスをすべてセットアップしました(キーを含む)など。
しかし、ユーザーがプログラムを簡単に見つけたり編集したりできない安全な場所で最初にプログラムを実行したときなど、どのように保存できるか疑問に思っていました。
私は NSUserDefaults standardUserDefaults をいじっていましたが、ユーザーは Library > Preferences でそのデータを簡単に見つけて編集できます。
ココア アプリケーションの試用部分を作成しようとしています。ライセンスをすべてセットアップしました(キーを含む)など。
しかし、ユーザーがプログラムを簡単に見つけたり編集したりできない安全な場所で最初にプログラムを実行したときなど、どのように保存できるか疑問に思っていました。
私は NSUserDefaults standardUserDefaults をいじっていましたが、ユーザーは Library > Preferences でそのデータを簡単に見つけて編集できます。
私はそれを超安全にすることに反対します。一度サーバーのアクティベーションを行いましたが、完全に廃止しました。理由のいくつかを次に示します。
これらの考えには、いくつかの、しかし非常に少数の例外があると確信しています。私が言いたいのは、登録のセキュリティに時間を無駄にするのではなく、
ファイルシステム上のファイルは使用できません。それをいじったりクラックしたりしようとしている人なら誰でも、基本的な標準の OSX 機能を介してファイルアクセスを追跡する方法を知っているほど賢いでしょう。したがって、追加中のファイルはアウトです。それだけでなく、アプリのアンインストール時に削除しないファイルを作成するのは悪い動作です。試用版アプリを削除した後、ユーザーがリソースを消費する必要はありません。
上で述べたように、バンドルをいじることも悪い考えです。これにより、3 つの基本的なオプションが残ります。
1) あまり気にしないでください。標準の場所と方法を使用する基本的な有効期限システムを使用します。保存するデータで暗号化を引き続き使用できますが、それも壊れることを知っておいてください. アプリが完全に人気がない場合を除き、著作権侵害が発生することを受け入れます。
2) ネットワーク呼び出しを使用して、サーバーで検証を行います。これには、アプリが実行するサービスに常にアクセスできる必要があります。これは一般的には良い考えではありません。サーバーがダウンした場合はどうなりますか? 彼らがオフラインの場合はどうなりますか?あなたと彼らの間でネットワークの問題が発生した場合はどうなりますか? これらのシナリオはすべて発生します。アプリが動作するために既にサーバーへの接続を必要としない限り (Twitter や Facebook のように)、そうした場合、顧客を失う可能性があります。
3) アプリケーション バンドルをいじったり、孤立したファイルを残したりして、「悪い市民」になりましょう。後者を行う場合は、少なくともアプリケーションに明確に関連するように、明確に名前を付けてください。
最終的に覚えておくべき重要なことは、ユーザーのマシンにはセキュリティがないということです。それは彼らのものです。つまり、彼らは物理的なアクセス権を持っているため、掘削を防ごうとする試みはほとんど無効になります。このように見ることもできます。あなたの市場がより技術志向であるほど、あなたが私たちよりも賢くなる可能性は低くなり、あなたの「セキュリティ」は破られるでしょう. 技術者以外の対象者向けに設計している場合、一般的に言えば、彼らはクラッキングしたり探したりすることを気にしないと考えることができます。
アプリをより良くするためにリソースを費やすか、試用期間を過ぎてアプリを使用していない人についてより良い気分を味わうことができます. そのうちの 1 つは売り上げを伸ばすことができますが、1 つはそうではありません。
[編集] また、これらのものを解読する最も一般的な (最も一般的ではないにしても) 手段の 1 つは、バイナリを変更することであることを指摘しておく必要があります。したがって、バンドルのいじりでコード署名を破ることで、実際にその方法に自分自身を開くことになります. ほとんどのクラックでは、チェックを行うルーチンが常に成功した認証を返すようにバイナリが変更されています。
必要に応じて、簡単で一般的な方法は、機密データを含むディスク上のファイルを暗号化するアプリケーションに埋め込まれているキーを使用することです。課題は、キーを安全にする方法です。
CommonCryptoダイジェストライブラリを調べてください。
これにより、ほとんどすべてのカジュアルユーザーから保護されます。ハッカーは十分な動機を持って、回避する方法を見つけることができますが。
Allan Odgaard は、OpenSSL を使用して Cocoa ソフトウェアのライセンス キーを生成/保存する方法について、かなりまともな記事を書いています。一読の価値ありかも。
名前がピリオドで始まるファイルをいくつかのフォルダーに保存してから、ファイルの非表示フラグを設定してみてください。
隠しファイルを置くのに適した場所は、users フォルダー (~/) のベースにあるあいまいな名前のファイルです。そこにはあいまいな隠しファイルがたくさんあるため、削除できるファイルと削除できないファイルを区別するのは困難です。パスの例: ~/.xdarwinprofileまたは同等に公式に聞こえるもの。
ファイルを非表示にするために機能するはずのコードを次に示します。
#include <assert.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <sys/attr.h>
#include <sys/errno.h>
#include <unistd.h>
#include <sys/vnode.h>
typedef struct attrlist attrlist_t;
struct FInfoAttrBuf {
u_int32_t length;
fsobj_type_t objType;
union {
char rawBytes[32];
struct {
FileInfo info;
ExtendedFileInfo extInfo;
} file;
struct {
FolderInfo info;
ExtendedFolderInfo extInfo;
} folder;
} finderInfo;
};
typedef struct FInfoAttrBuf FInfoAttrBuf;
- (int)SetFileInvisibility:(NSString *)filePath state:(BOOL)isInvisible) {
attrlist_t attrList;
FInfoAttrBuf attrBuf;
char *path = [filePath cStringUsingEncoding: NSUTF8StringEncoding];
memset(&attrList, 0, sizeof(attrList));
attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
attrList.commonattr = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO;
int err = getattrlist(path, &attrList, &attrBuf, sizeof(attrBuf), 0);
if (err != 0)
return errno;
// attrBuf.objType = (VREG | VDIR), inconsequential for invisibility
UInt16 flags = CFSwapInt16BigToHost(attrBuf.finderInfo.file.info.finderFlags);
if (isInvisible)
flags |= kIsInvisible;
else
flags &= (~kIsInvisible);
attrBuf.finderInfo.file.info.finderFlags = CFSwapInt16HostToBig(flags);
attrList.commonattr = ATTR_CMN_FNDRINFO;
err = setattrlist(path, &attrList, attrBuf.finderInfo.rawBytes, sizeof(attrBuf.finderInfo.rawBytes), 0);
return err;
}
この質問への回答からこのコードを変更しました。より役立つ情報が見つかるかもしれません: How to make a file invisible in Finder using Objective-C
このコードはテストしていませんが、動作するはずです。実際、コードが不要な可能性があり、ファイル名の前にドットを付けてファイルを保存するだけで機能します。
管理者権限を持っている場合は、ファイルに対して sudo chmod を実行し、必要に応じて読み取り専用に設定できますが、アプリでユーザーにパスワードを要求しないでください。
このソリューションは私にとって非常にうまくいきました。これを試してください: https://github.com/nielsmouthaan/SecureNSUserDefaults。暗号化された bool/string/float/integer を UserDefaults ファイルに保存します。うまくいけば、これはあなたが望むものです。CocoaSecurity をダウンロードしてプロジェクトに追加してください (ダウンロード リンクについては、SecureNSUserDefaults GitHub ページを参照してください)。CocoaSecurity は SecureNSUSerDefaults の必須要素であるため、ファイルにインポートする必要はありません。CocoaSecurity の必須要素であるBase64もダウンロードする必要があります。また、Base64 をプロジェクトに追加する必要がありますが、ファイルにインポートする必要はありません。
利用方法
暗号化方式を使用する任意の場所にヘッダー ファイルをインポートします。
#import <SecureNSUserDefaults/NSUserDefaults+SecureAdditions.h>
次に、おそらくawakeFromNib
メソッドで暗号化キーを設定します。
[[NSUserDefaults standardUserDefaults] setSecret:@"your_secret_goes_here"];
数字と文字のランダムな文字列を生成することをお勧めします。次に、その情報を UserDefaults ファイルに保存する必要があります。
[[NSUserDefaults standardUserDefaults]
setSecretObject:@"your_secret_object"
forKey:@"the_key_your_object_will be_stored_under"];
文字列を取得するには、次のメソッドを使用します。
NSString *retrievedData = [[NSUserDefaults standardUserDefaults]
secretStringForKey:@"the_key_your_object_will be_stored_under"];
これが役立つことを願っています!