パスワードをNSString
オブジェクトに保存する必要があります。しかし、私はそれらを難読化するいくつかの方法を望んでいるので、メモリから直接読み取ることはできません。NSStringにパスワードをメモリに格納せずに保存する
これはMac OS X(10.5)アプリケーションですが、iPhone上でも動作する解決策は非常に高く評価されます。
パスワードをNSString
オブジェクトに保存する必要があります。しかし、私はそれらを難読化するいくつかの方法を望んでいるので、メモリから直接読み取ることはできません。NSStringにパスワードをメモリに格納せずに保存する
これはMac OS X(10.5)アプリケーションですが、iPhone上でも動作する解決策は非常に高く評価されます。
パスワードを格納するためにキーチェーンを使用すると、文字列を渡す代わりに、不透明なキーチェーンSecKeychainItemRefs
を処理して、必要な場所で平文を取得することしかできません。これは、Macユーザーがパスワードの処理を期待する方法でもあります。残念ながら「NSString
オブジェクトにパスワードを保存する必要がある」理由がわからないのですが、それは本当に本当であるかどうかはわかりません:-)
サンドボックスでは、デスクトップ上ではそれほど簡単ではありません。
クリアテキストではなくハッシュとしてパスワードを保存する必要があります。私はこれが機能に影響を与えずにあなたが望む結果を得ると信じています。唯一行うことができないと思うのは、平文のパスワードをもう一度アクセスすることです。強力のために分析したり、別のサービスに渡したりしたい場合は、もう一度アクセスしてください。一般的に、ハッシュは機能を犠牲にすることはありません。
次のコードは、rawPasswordでパスワードを取り、そのSHA-1ハッシュをpasswordHashに格納します。
#import <CommonCrypto/CommonDigest.h>
const char* utf8PasswordRepresentation = [rawPassword UTF8String];
unsigned char * rawHash = malloc(CC_SHA1_DIGEST_LENGTH);
CC_SHA1(utf8PasswordRepresentation, strlen(utf8PasswordRepresentation), rawHash);
NSMutableString* passwordHash = [NSMutableString CC_SHA1_DIGEST_LENGTH*2];
for (int i = 0 ; i< CC_SHA1_DIGEST_LENGTH; i++)
[passwordHash appendFormat:@"%02x" , rawHash[i]];
ここではメモリ管理はありません。
explanation of password hashingのウィキペディアのエントリーをチェックしてください。
この同じコードの多くのバージョンがインターチューブの周りにあります。キーチェーンにしてからパスワードを格納および取得するためのコードの
あなたはstringWithCapacityを逃しました:8行 – nico
非常に便利なセットは、ここで見つけることができます:
http://log.scifihifi.com/post/55837387/simple-iphone-keychain-code
私はそれを使用しました、それがうまく働きました。
私は、ポスターがメモリ内のパスワードを難読化することを指していると思いますので、メモリからivarの内容を読み取ることはできません。 GoogleのGDataライブラリには、インスタンス変数にNSMutableDataとして保存されたパスワードを排除するための便利なコードがあります。
// XorPlainMutableData is a simple way to keep passwords held in heap objects
// from being visible as plain-text
static void XorPlainMutableData(NSMutableData *mutable) {
// this helps avoid storing passwords on the heap in plaintext
const unsigned char theXORValue = 0x95; // 0x95 = 0xb10010101
unsigned char *dataPtr = [mutable mutableBytes];
NSUInteger length = [mutable length];
for (NSUInteger idx = 0; idx < length; idx++) {
dataPtr[idx] ^= theXORValue;
}
}
あなたは(#passwordと#setUserCredentialsWithUsername参照:パスワード:同じファイル内のメソッド)をXORを使用してパスワードを保存/復元することができます。 XORはハイテク暗号化ではありませんが、カジュアルスヌーピングを抑止するのに十分です。パスワードデータへの参照を保持するアプリケーションで長寿命のサービス/マネージャオブジェクトを使用するGDataクライアントの場合、これは合理的なアプローチだと思います。
ブライアン、元々これは私が言及していたものですが、グレアムリーの答えは私の問題をよりよく解決します。しかし、これも非常に便利です+1 – rjstelling
なぜあなたは文字列でそれらを格納する必要がありますか、なぜそのメモリを取得しようとしている人はいますか? –