Colección de citas famosas - Slogan de motivación - ¿Cuáles son los métodos de cifrado de la información del usuario durante el desarrollo en iOS?

¿Cuáles son los métodos de cifrado de la información del usuario durante el desarrollo en iOS?

5.1 Evite la transmisión de datos en texto sin formato mediante codificación URLENCODE + BASE64 simple

5.2 Para solicitudes ordinarias y datos devueltos, genere verificación MD5 (agregando claves dinámicas a MD5) para garantizar la integridad de los datos ( simple anti-manipulación, baja seguridad, ventaja: rápida) verificación.

5.3 Para datos importantes, utilice RSA para firma digital para evitar manipulaciones.

5.4 Para datos relativamente confidenciales, como información del usuario (inicio de sesión, registro, etc.), el cliente utiliza cifrado RSA al enviar y el servidor regresa utilizando cifrado DES (AES).

Motivo: la razón por la que el cliente utiliza el cifrado RSA para el envío es porque el descifrado RSA requiere conocer la clave privada del servidor, y la clave privada del servidor generalmente es difícil de robar si se utiliza DES, se puede obtener; al descifrar la clave del cliente, es menos seguro. La razón por la que se usa DES cuando lo devuelve el servidor es porque, ya sea que se use DES o RSA, la clave (o clave privada) se almacena en el cliente y existe el riesgo de ser descifrada. Por lo tanto, es necesario crear una clave dinámica. utilizado, y la generación de claves RSA es más compleja y no adecuada para claves dinámicas, y RSA es relativamente lento, por lo que se elige DES)

Por favor, publique el código del algoritmo relevante (de hecho, puede ser más fácil de usar algunas bibliotecas maduras de terceros) Simple, pero escríbalo usted mismo, sea gratuito). Tenga en cuenta que la mayoría de los algoritmos de cifrado aquí se refieren a algunos algoritmos maduros existentes o se utilizan directamente.

1. MD5

//Debido a que se utiliza la categoría, no se pasan parámetros

-(NSString *) stringFromMD5 {

if(self == nil || [self length] == 0) {

return nil;

}

const char *value = [ self UTF8String ];

buffer de salida de caracteres sin firmar[CC_MD5_DIGEST_LENGTH];

CC_MD5(valor, strlen(valor), buffer de salida);

NSMutableString *outputString = [[ NSMutableString alloc ] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){

[outputString appendFormat:@"%02x",outputBuffer[ count] ];

}

return [outputString autorelease];

}

2. NSString *) base64EncodeData: (NSData *) objData {

const unsigned char * objRawData = [objData bytes];

char * objPointer;

char * strResult ;

// Obtenga la longitud de los datos sin procesar y asegúrese de que realmente tengamos datos

int intLength = [objData length];

if (intLength == 0) return nil;

// Configura el marcador de posición del resultado basado en cadena y el puntero dentro de ese marcador de posición

strResult = (char *)calloc(((intLength + 2) / 3) * 4 , sizeof(char));

objPointer = strResult;

// Iterar a través de todo

while (intLength > 2) { // continuar hasta que tener menos de 24 bits

*objPointer++ = _base64EncodingTable[objRawData[0] >> 2];

*objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) < < 4 ) + (objRawData[1] >> 4)];

*ob

jPointer++ = _base64EncodingTable[((objRawData[1] & 0x0f) << 2) + (objRawData[2] >> 6)];

*objPointer++ = _base64EncodingTable[objRawData[2] & 0x3f];

// acabamos de manejar 3 octetos (24 bits) de datos

objRawData += 3;

intLength -= 3;

}

// ahora nos ocupamos del final de las cosas

if (intLength != 0) {

*objPointer++ = _base64EncodingTable[objRawData[0] > > 2];

if (intLength > 1) {

*objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] > > 4)];

*objPointer++ = _base64EncodingTable[(objRawData[1] & 0x0f) << 2];

*objPointer++ = '=';

} else {

*objPointer++ = _base64EncodingTable[(objRawData[0] & 0x03) << 4];

*objPointer++ = '=';

*objPointer++ = '=';

}

}

// Terminar el resultado basado en cadenas

*objPointer = '\ 0';

NSString *rstStr = [NSString stringWithCString:strResult codificación:NSASCIIStringEncoding];

free(objPointer);

devuelve rstStr;

}

3. AES

-(NSData*) EncryptAES: (NSString *) clave {

char keyPtr[kCCKeySizeAES256+1];

bzero(keyPtr, sizeof(keyPtr));

[key getCString:keyPtr maxLength:sizeof(keyPtr) codificación:NSUTF8StringEncoding];

NSUInteger dataLength = [ self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

siz

e_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,

kCCOptionPKCS7Padding | kCCOptionECBMode,

keyPtr, kCCBlockSizeAES128,

NULL,

[self bytes], dataLength,

buffer, bufferSize,

&numBytesEncrypted);

if (cryptStatus == kCCSuccess ) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

}

free(buffer);

return nil;

}

4. RSA

- (NSData *) encryptWithData:(NSData *)content {

size_t PlainLen = [contenido length];

if (plainLen > maxPlainLen) {

NSLog(@"content(%ld) es demasiado largo, debe < %ld", PlainLen, maxPlainLen);

return nil;

}

void *plain = malloc(plainLen);

[content getBytes:plain

length:plainLen];

size_t cipherLen = 128; // actualmente la longitud de la clave RSA está establecida en 128 bytes

void *cipher = malloc(cipherLen);

OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, simple,

PlainLen, cipher, &cipherLen);

NSData *resultado = nil;

if (returnCode != 0) {

No

SLog(@"SecKeyEncrypt falló. Código de error: %ld", returnCode);

}

else {

resultado = [NSData dataWithBytes:cipher p>

longitud:cipherLen];

}

libre(simple);

libre(cifrado);

devolver resultado;

}