0

さまざまなデータ領域にアクセスするために複数のパスワードを必要とするアプリを開発しています。たとえば、ユーザーのグループは、表示するためにパスワード認証が必要なチャットを設定できます。

これが私がそれを行うことを検討している方法です:

私は自分のキーワードを持っています。仮説的に言ってみましょう:

バナナ

ユーザーがパスワードを入力すると、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;
}
4

2 に答える 2

1

それは良い方法ではありません。パスワードをハッシュするには、一方向ハッシュ アルゴリズムを使用する必要があります (暗号化を解除することはできません)。パスワードをハッシュした後、ユーザーがパスワードを提供した後、それをデータベースに保存します。パスワードをハッシュし、それ (ハッシュ値) をデータベースに保存したハッシュと比較する必要があります。一致する場合は、認証が失敗した場合と同じであることを意味します。

そうすれば、誰かがデータベースにアクセスしたとしても、データは保護されます。彼はそれに対して何もしません。そこに保存されているパスワードではありません。

ほとんどの認証はそのように行われます。

//拡張

この種のジョブ用に作成されたハッシュ アルゴリズムを使用する必要があります。

SHAまたはMD5を確認してください

于 2014-03-21T16:10:57.973 に答える