0

破棄できないハッシュ化されたパスワードを持つ mySQL データベースがあります。作成中の iOS アプリでのログイン用のハッシュ作成に一貫性を持たせるために、mySQL の encrypt() 関数を複製する必要があります。(パスワードの最初の 2 文字を暗号化機能のソルトとして使用しています)

誰もこれを以前にやったことがありますか?他の場所で見つけたコードに基づいて、次のカテゴリを NSString に追加しようとしましたが、結果の文字列は似ていません。(私は NSData に base64 カテゴリを持っています。はい、CCCrypt 呼び出しは初めてです)

-(NSString*) encryptWithSalt:(NSString *)salt {
NSString *token = self;

const void *vplainText;
size_t plainTextBufferSize = [token length];
vplainText = (const void *) [token UTF8String];
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;

bufferPtrSize = (plainTextBufferSize + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);

uint8_t iv[kCCBlockSizeDES];
memset((void *) iv, 0x0, (size_t) sizeof(iv)); // zero out iv
const void *vkey = (const void *) [salt UTF8String];

ccStatus = CCCrypt(kCCEncrypt,
        kCCAlgorithmDES,
        kCCOptionPKCS7Padding | kCCModeCBC,
        vkey,
        kCCKeySizeDES,
        iv,
        vplainText,
        plainTextBufferSize,
        (void *)bufferPtr,
        bufferPtrSize,
        &movedBytes);

NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];

NSString* hash;
if (ccStatus == kCCSuccess) {
    hash = [myData base64EncodedString];
}

return hash;
}
4

1 に答える 1

0

DES E-box を変更するためにソルトが使用されるため、CCCrypt を使用して関数をエミュレートすることはcrypt()できません。これにより、使用中の暗号が実際には DES ではなくなります。

しかし、それはまだ単なるcrypt()機能です。直接呼び出します。

- (NSString*) encryptWithSalt:(NSString *)salt {
    return [NSString stringWithUTF8String:crypt([self UTF8String], [salt UTF8String])];
}

ちなみに、パスワードの最初の 2 文字をソルトとして使用すると、パスワード検索スペースが 6 文字に狭まるため、巨大なセキュリティ ホールになります (最初の 2 文字はソルトによって与えられるため)。

于 2013-04-03T17:17:40.833 に答える