в моем приложении я хранить 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];
Проблема в том, что она выходит строку зашифрованной которой я не могу использовать. Любые советы о том, как его расшифровать? Заранее спасибо
я прошу прощения, если это заблуждение, это просто шаблон я нашел.Итак, вы говорите мне, что нет способа отменить это кодирование и что я должен хранить элементы в цепочке ключей без какой-либо кодировки? Лучший способ - удалить все хэш-функции? в любом случае спасибо за ответ! – r4id4
Никогда не копируйте код шифрования, не имея четкого представления о том, что он делает. Это справедливо для всего кода, но вдвойне верно для кода безопасности. Очень легко реализовать код шифрования очень небезопасно. Для этого случая вы, скорее всего, просто вызовите '+ createKeychainValue: forIdentifier:' и ничего другого, но неясно, какую проблему вы пытаетесь решить. Если у вас есть какая-то конкретная проблема, лучше всего задать вопрос здесь, а не искать образцы кода. –
То, что я хотел достичь, это кодировать некоторые данные и сохранять их в цепочке ключей для двойной защиты. Затем мне нужно было получить данные, но они были закодированы, и я не мог предоставить «декодированный». Но, как вы сказали, способ, которым я занимался, был односторонним, поэтому нельзя было обратить вспять. Еще раз спасибо за ваши ответы. – r4id4