2009-04-14 20 views
7

パスワードをNSStringオブジェクトに保存する必要があります。しかし、私はそれらを難読化するいくつかの方法を望んでいるので、メモリから直接読み取ることはできません。NSStringにパスワードをメモリに格納せずに保存する

これはMac OS X(10.5)アプリケーションですが、iPhone上でも動作する解決策は非常に高く評価されます。

+0

なぜあなたは文字列でそれらを格納する必要がありますか、なぜそのメモリを取得しようとしている人はいますか? –

答えて

12

パスワードを格納するためにキーチェーンを使用すると、文字列を渡す代わりに、不透明なキーチェーンSecKeychainItemRefsを処理して、必要な場所で平文を取得することしかできません。これは、Macユーザーがパスワードの処理を期待する方法でもあります。残念ながら「NSStringオブジェクトにパスワードを保存する必要がある」理由がわからないのですが、それは本当に本当であるかどうかはわかりません:-)

3

あなたはそれらをNSStringに入れる前にmd5できませんでしたか?次に、テストするときに、入力文字列をmd5にして、格納されている文字列と比較します。

+0

それは誰でもそれらを読むことを止めません。 – Chuck

+0

真。しかし、あなたはmd5文字列を認証に使うことができず、パスワードが何を使っているのかは分かりません。 – Ronald

+0

パスワードの読み取りを中止しますが、異なるハッシュへのアクセスを許可します。 –

3

サンドボックスでは、デスクトップ上ではそれほど簡単ではありません。

クリアテキストではなくハッシュとしてパスワードを保存する必要があります。私はこれが機能に影響を与えずにあなたが望む結果を得ると信じています。唯一行うことができないと思うのは、平文のパスワードをもう一度アクセスすることです。強力のために分析したり、別のサービスに渡したりしたい場合は、もう一度アクセスしてください。一般的に、ハッシュは機能を犠牲にすることはありません。

次のコードは、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のウィキペディアのエントリーをチェックしてください。

この同じコードの多くのバージョンがインターチューブの周りにあります。キーチェーンにしてからパスワードを格納および取得するためのコードの

+0

あなたはstringWithCapacityを逃しました:8行 – nico

2

私は、ポスターがメモリ内のパスワードを難読化することを指していると思いますので、メモリからivarの内容を読み取ることはできません。 GoogleのGDataライブラリには、インスタンス変数にNSMutableDataとして保存されたパスワードを排除するための便利なコードがあります。

source for GDataServiceBase.m

// 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クライアントの場合、これは合理的なアプローチだと思います。

+0

ブライアン、元々これは私が言及していたものですが、グレアムリーの答えは私の問題をよりよく解決します。しかし、これも非常に便利です+1 – rjstelling

関連する問題