objective-c实现mySQL encrypt()函数

时间:2013-04-03 16:56:22

标签: mysql ios objective-c

我有一个带有哈希密码的mySQL数据库,我不能放弃。我需要复制mySQL的encrypt()函数,以便我可以在我的哈希创建中保持一致,以便在我正在创建的iOS应用程序中登录。 (我使用密码的前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;
}

1 个答案:

答案 0 :(得分:0)

无法使用CCCrypt模拟crypt()函数,因为salt用于更改DES电子邮箱。这使得使用的密码不再是真正的DES。

但是,它仍然只是crypt()功能。直接打电话:

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

顺便提一下,使用密码的前两个字符作为盐是一个巨大的安全漏洞,因为它将密码搜索空间缩小到六个字符(因为前两个字符由盐)。