パスワードをNSStringオブジェクトに保存する必要があります。ただし、メモリから直接読み取ることができないように、それらを難読化する方法が必要です。
これは Mac OS X (10.5) アプリケーションですが、iPhone でも動作するソリューションがあれば大歓迎です。
パスワードの保存にキーチェーンを使用する場合は、文字列を渡す代わりに、不透明なキーチェーンを処理して、SecKeychainItemRefs必要な場所でのみプレーンテキストを取得できます。これは、Macユーザーが自分のパスワードが処理されることを期待する方法でもあります。残念ながら、なぜ「パスワードをNSStringオブジェクトに保存する必要がある」のかわからないので、それが本当に本当かどうかはわかりません:-)
NSStringに入れる前にmd5を実行するだけではいけませんか?次に、テストに行くときに、入力文字列をmd5して、保存されているものと比較しますか?
iPhone では、サンドボックスがパスワードへのアクセスを阻止します。デスクトップではそれほど簡単ではありません。
パスワードはクリアテキストではなくハッシュとして保存する必要があります。これにより、機能に影響を与えることなく、必要な結果が得られると思います。クリアテキストのパスワードに再度アクセスすることは決してできないと考えてください - 強度を分析したり、別のサービスに渡したりしたい場合。ただし、一般に、ハッシュは機能を犠牲にしません。
次のコードは 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]];
ここにはメモリ管理がないことに注意してください。
パスワード ハッシュの説明については、ウィキペディアのエントリを参照してください。
インターチューブの周りには、この同じコードの多くのバージョンがあります。
ポスターはメモリ内のパスワードを難読化することについて言及していると思うので、 ivar の内容をメモリから読み取ることはできません。Google の GData ライブラリには、インスタンス変数に NSMutableData として格納されているパスワードを XOR するための便利なコードが含まれています。
// 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;
}
}
XOR を使用してパスワードを保存/復元できます (同じファイルの #password および #setUserCredentialsWithUsername:password: メソッドを参照)。XOR はハイテク暗号化ではありませんが、カジュアルなスヌーピングを抑止するには十分です。パスワード データへの参照を保持するアプリケーション内に長寿命のサービス/マネージャー オブジェクトがある可能性がある GData クライアントの場合、これは妥当なアプローチだと思います。
キーチェーンとの間でパスワードを保存および取得するための非常に便利なコード セットは、次の場所にあります。
http://log.scifihifi.com/post/55837387/simple-iphone-keychain-code
私はそれを使用しました、そしてそれはうまくいきました。