2014-01-21 3 views
0

в моем приложении я хранить NSString зашифрованного брелки с этим методомДешифровка строки сохраняется в брелке

NSUInteger fieldHash = [myStringToSave hash]; 
     // Encrypt 
     NSString *fieldString = [KeychainWrapper securedSHA256DigestHashForPIN:fieldHash]; 
     // Save in Keychain 
     if ([KeychainWrapper createKeychainValue:fieldString forIdentifier:PASSWORD]) { 
      [[NSUserDefaults standardUserDefaults] setBool:YES forKey:PASSWORD]; 
      [[NSUserDefaults standardUserDefaults] synchronize]; 

в KeychainWrapper.m есть этот метод

+ (BOOL)createKeychainValue:(NSString *)value forIdentifier:(NSString *)identifier 
{ 

    NSMutableDictionary *dictionary = [self setupSearchDirectoryForIdentifier:identifier]; 
    NSData *valueData = [value dataUsingEncoding:NSUTF8StringEncoding]; 
    [dictionary setObject:valueData forKey:(__bridge id)kSecValueData]; 

    // Protect the keychain entry so it's only valid when the device is unlocked. 
    [dictionary setObject:(__bridge id)kSecAttrAccessibleWhenUnlocked forKey:(__bridge id)kSecAttrAccessible]; 

    // Add. 
    OSStatus status = SecItemAdd((__bridge CFDictionaryRef)dictionary, NULL); 

    // If the addition was successful, return. Otherwise, attempt to update existing key or quit (return NO). 
    if (status == errSecSuccess) { 
     return YES; 
    } else if (status == errSecDuplicateItem){ 
     return [self updateKeychainValue:value forIdentifier:identifier]; 
    } else { 
     return NO; 
    } 
} 

и это

+ (NSString *)securedSHA256DigestHashForPIN:(NSUInteger)pinHash 
{ 
    // 1 
    NSString *name = [[NSUserDefaults standardUserDefaults] stringForKey:USERNAME]; 
    name = [name stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    // 2 
    NSString *computedHashString = [NSString stringWithFormat:@"%@%i%@", name, pinHash, SALT_HASH]; 
    // 3 
    NSString *finalHash = [self computeSHA256DigestForString:computedHashString]; 
    //NSLog(@"** Computed hash: %@ for SHA256 Digest: %@", computedHashString, finalHash); 
    return finalHash; 
} 

+ (NSString*)computeSHA256DigestForString:(NSString*)input 
{ 

    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding]; 
    NSData *data = [NSData dataWithBytes:cstr length:input.length]; 
    uint8_t digest[CC_SHA256_DIGEST_LENGTH]; 

    CC_SHA256(data.bytes, data.length, digest); 

    // Setup our Objective-C output. 
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; 

    // Parse through the CC_SHA256 results (stored inside of digest[]). 
    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { 
     [output appendFormat:@"%02x", digest[i]]; 
    } 

    return output; 
} 

Чтобы получить значение, хранящееся в брелках, я использую это

+ (NSString *)keychainStringFromMatchingIdentifier:(NSString *)identifier 
{ 
    NSData *valueData = [self searchKeychainCopyMatchingIdentifier:identifier]; 
    if (valueData) { 
     NSString *value = [[NSString alloc] initWithData:valueData 
               encoding:NSUTF8StringEncoding]; 
     return value; 
    } else { 
     return nil; 
    } 
} 

передавая ПАРОЛЬ идентификатора как этого

NSString *myNewString = [KeychainWrapper keychainStringFromMatchingIdentifier:PASSWORD]; 

Проблема в том, что она выходит строку зашифрованной которой я не могу использовать. Любые советы о том, как его расшифровать? Заранее спасибо

ответ

1

Ничто в приведенном выше коде не шифрует ничего. Кажется, что вы используете свое значение через NSString hash, а затем SHA-256. Оба эти являются односторонними хешами. По дизайну они не могут быть отменены.

В целом, этот код очень запутан, и неясно, чего вы пытаетесь достичь. Обычно вы не шифруете данные, которые вы помещаете в брелок.

Обратите внимание, что ваша хеш-функция будет обрезать многобайтные строки (например, китайские).

const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding]; 
NSData *data = [NSData dataWithBytes:cstr length:input.length]; 

Это должно быть:

NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding]; 
+0

я прошу прощения, если это заблуждение, это просто шаблон я нашел.Итак, вы говорите мне, что нет способа отменить это кодирование и что я должен хранить элементы в цепочке ключей без какой-либо кодировки? Лучший способ - удалить все хэш-функции? в любом случае спасибо за ответ! – r4id4

+0

Никогда не копируйте код шифрования, не имея четкого представления о том, что он делает. Это справедливо для всего кода, но вдвойне верно для кода безопасности. Очень легко реализовать код шифрования очень небезопасно. Для этого случая вы, скорее всего, просто вызовите '+ createKeychainValue: forIdentifier:' и ничего другого, но неясно, какую проблему вы пытаетесь решить. Если у вас есть какая-то конкретная проблема, лучше всего задать вопрос здесь, а не искать образцы кода. –

+0

То, что я хотел достичь, это кодировать некоторые данные и сохранять их в цепочке ключей для двойной защиты. Затем мне нужно было получить данные, но они были закодированы, и я не мог предоставить «декодированный». Но, как вы сказали, способ, которым я занимался, был односторонним, поэтому нельзя было обратить вспять. Еще раз спасибо за ваши ответы. – r4id4

1

Этот код одного из учебников на веб-сайте Ray Wenderlich в. См: http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1 для получения дополнительной информации

Основная идея заключается в том, что вы зашифровать пароль перед сохранением его в связке ключей, используя методы:

  • (NSString *) securedSHA256DigestHashForPIN: (NSUInteger) pinHash;
  • (NSString *) computeSHA256DigestForString: (NSString *) input;

Затем, когда пользователь вводит пароль, вы можете зашифровать его таким же образом и сравнить два значения, чтобы узнать, введен ли пользователь правильный пароль. Как говорится в других ответах, вы не можете отменить шифрование, чтобы найти пароль, но вам не нужно, если вы просто сравниваете сохраненный пароль с введенным паролем.

Я думаю, что шифрование пароля на пути в цепочку ключей может быть излишним, поскольку пароль должен быть зашифрован и защищен в любом случае, но все равно не увидит никакого вреда при его выполнении (если только вам не потребуется восстановить исходный пароль).

Если вы хотите, чтобы зашифровать и расшифровать строку, а затем проверить этот вопрос:

AES Encryption for an NSString on the iPhone

Смежные вопросы