L'API des services de sécurité ne semble pas me permettre de calculer directement un hachage. Il existe de nombreuses versions du domaine public et sous licence libérale disponibles, mais je préférerais utiliser une implémentation de bibliothèque système si possible.
Les données sont accessibles via NSData ou des pointeurs simples.
La force cryptographique du hachage est importante pour moi. SHA-256 est la taille de hachage minimale acceptable.
C'est ce que j'utilise pour SHA1:
#import <CommonCrypto/CommonDigest.h>
+ (NSData *)sha1:(NSData *)data {
unsigned char hash[CC_SHA1_DIGEST_LENGTH];
if ( CC_SHA1([data bytes], [data length], hash) ) {
NSData *sha1 = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];
return sha1;
}
return nil;
}
Remplacez CC_SHA1
par CC_SHA256
(ou selon votre choix), ainsi que CC_SHA1_DIGEST_LENGTH
par CC_SHA256_DIGEST_LENGTH
.
En voici un assez similaire basé sur NSString
+ (NSString *)hashed_string:(NSString *)input
{
const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
// This is an iOS5-specific method.
// It takes in the data, how much data, and then output format, which in this case is an int array.
CC_SHA256(data.bytes, data.length, digest);
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;
}
(Les crédits vont à http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1 )
C'est ce qui a fonctionné pour moi
func sha256(securityString : String) -> String {
let data = securityString.dataUsingEncoding(NSUTF8StringEncoding)!
var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA256(data.bytes, CC_LONG(data.length), &hash)
let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH))
for byte in hash {
output.appendFormat("%02x", byte)
}
return output as String
}
Ci-dessous, le lien que j'ai utilisé pour créer la valeur de hachage du document. Il est très simple et facile à calculer, spécialement pour les gros fichiers.
J'ai nettoyé https://stackoverflow.com/a/13199111/1254812 un peu et l'ai structuré comme une extension NSString
@interface NSString (SHA2HEX)
/*
Get the SHA2 (256 bit) digest as a hex string.
*/
@property (nonatomic, readonly) NSString* sha2hex;
@end
@implementation NSString (SHA2HEX)
- (NSString*)sha2hex
{
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
if (data.length > UINT32_MAX)
return nil;
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(data.bytes, (CC_LONG)data.length, digest);
const int hexlen = CC_SHA256_DIGEST_LENGTH * 2;
NSMutableString *hexstr = [NSMutableString stringWithCapacity:hexlen];
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[hexstr appendFormat:@"%02x", digest[i]];
}
return hexstr;
}
@end
+ (NSData *)sha256DataFromData:(NSData *)data {
unsigned char result[CC_SHA256_DIGEST_LENGTH];
CC_SHA256([data bytes], (int)[data length], result);
return [NSData dataWithBytes:result length:CC_SHA256_DIGEST_LENGTH];
}