さまざまなデータ領域にアクセスするために複数のパスワードを必要とするアプリを開発しています。たとえば、ユーザーのグループは、表示するためにパスワード認証が必要なチャットを設定できます。
これが私がそれを行うことを検討している方法です:
私は自分のキーワードを持っています。仮説的に言ってみましょう:
バナナ
ユーザーがパスワードを入力すると、RNCryptor をBanana
使用して入力したキーを使用して暗号化し、その暗号化された文字列をサーバーに保存します。
後で誰かがパスワードを入力しようとすると、サーバーからハッシュ値を取得し、入力したパスワードをキーとして使用して復号化を試みます。復号化された値が等しい場合、Banana
彼らが正しいパスワードを入力したことがわかります。
私はセキュリティに不慣れなので、これが適切な解決策になるかどうかわかりません。すべての助けに感謝します。
アップデート
@Gregと適切な名前の@Anti-weakpasswordsによって提案されたいくつかの変更を行った後、ここに私が持っているものがあります:
- (NSDictionary *) getPasswordDictionaryForPassword:(NSString *)password {
NSData * salt = [self generateSalt256];
NSData * key = [RNCryptor keyForPassword:password salt:salt settings:mySettings];
NSMutableDictionary * passwordDictionary = [NSMutableDictionary new];
NSString * saltString = stringFromData(salt);
NSString * keyString = stringFromData(key);
passwordDictionary[@"key"] = keyString;
passwordDictionary[@"salt"] = saltString;
passwordDictionary[@"version"] = @"1.0.0";
passwordDictionary[@"iterationCount"] = @"10000";
return passwordDictionary;
}
static const RNCryptorKeyDerivationSettings mySettings = {
.keySize = kCCKeySizeAES256,
.saltSize = 32,
.PBKDFAlgorithm = kCCPBKDF2,
.PRF = kCCPRFHmacAlgSHA1,
.rounds = 10000
};
- (NSData *)generateSalt256 {
unsigned char salt[32];
for (int i=0; i<32; i++) {
salt[i] = (unsigned char)arc4random();
}
NSData * dataSalt = [NSData dataWithBytes:salt length:sizeof(salt)];
return dataSalt;
}