5

この記事に従って、パスワード暗号化機能をアプリに書き込もうとしています。

関数を実行し、CCCalibratePBKDFラウンド数を出力する関数を作成しました。

const uint32_t oneSecond = 1000;
uint rounds = CCCalibratePBKDF(kCCPBKDF2,
                               predictedPasswordLength,
                               predictedSaltLength,
                               kCCPRFHmacAlgSHA256,
                               kCCKeySizeAES128,
                               oneSecond);

これは完全に機能しますが、次の部分を実装しようとすると、すべてがうまくいきません。

関数呼び出しの記述を開始するCCKeyDerivationPBKDFと、関数とすべてのパラメーターが自動的に完了します。入力を進めると、すべてのパラメーターも自動入力されます。

- (NSData *)authenticationDataForPassword: (NSString *)password salt: (NSData *)salt rounds: (uint) rounds
{
    const NSString *plainData = @"Fuzzy Aliens";
    uint8_t key[kCCKeySizeAES128] = {0};
    int keyDerivationResult = CCKeyDerivationPBKDF(kCCPBKDF2,
                                                   [password UTF8String],
                                                   [password lengthOfBytesUsingEncoding: NSUTF8StringEncoding],
                                                   [salt bytes],
                                                   [salt length],
                                                   kCCPRFHmacAlgSHA256,
                                                   rounds,
                                                   key,
                                                   kCCKeySizeAES128);
    if (keyDerivationResult == kCCParamError) {
        //you shouldn't get here with the parameters as above
        return nil;
    }
    uint8_t hmac[CC_SHA256_DIGEST_LENGTH] = {0};
    CCHmac(kCCHmacAlgSHA256,
           key,
           kCCKeySizeAES128,
           [plainData UTF8String],
           [plainData lengthOfBytesUsingEncoding: NSUTF8StringEncoding],
           hmac);
    NSData *hmacData = [NSData dataWithBytes: hmac length: CC_SHA256_DIGEST_LENGTH];
    return hmacData;
}

しかし、私がヒットするとすぐに; 「「CCKeyDerivationPBKDF」の呼び出しに一致する関数がありません」というエラーをマークし、ビルドなどを行いません。

CommonCrypto/CommonKeyDerivation.hとCommonCrypto/CommonCryptor.hをインポートしました。これらは両方とも、列挙型の名前に必要だったためです。

4

2 に答える 2

2

まず、インクルードパスで面白いことをしていないことを確認します(特に、混乱を招くだけの@HachiEthanのソリューションはお勧めしません)。一般的に、これはそのままにしておき、具体的にはそのようなものを追加しない/usr/includeでください。Security.frameworkリンクステップに追加したことを確認してください。これが問題の通常の原因です。

確認したい最大のことは、iOS 5 Security.frameworkを取得していることです(OS X10.6やiOS4バージョンなどの他のバージョンではありません)。しかし、私の疑いは、ビルド設定に問題があるということです。

これらすべてを参照用に実行するフレームワークを確認したい場合は、RNCryptorを参照してください。

于 2012-08-13T18:00:35.597 に答える
2

そうです、私は問題(そして解決策)を見つけました。

ZXingを使用していたため、.mファイルの名前を.mmに変更して、ZXingライブラリでC++のものを実行できるようにする必要がありました。

理由はわかりませんが、この方法でファイルの名前を変更すると、CCKeyDerivationPBKDF関数が機能しなくなりました。

暗号コードを独自のクラスに移動し、.mのままにしました。必要なのは、元の投稿で行ったように2つのインポートを含めることだけです。

フレームワークなどを含める必要はありませんでした。

于 2012-08-14T07:59:36.047 に答える