中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

IOS常用加密算法

2018-07-20    來(lái)源:open-open

容器云強(qiáng)勢(shì)上線(xiàn)!快速搭建集群,上萬(wàn)Linux鏡像隨意使用
1 通過(guò)簡(jiǎn)單的URLENCODE + BASE64編碼防止數(shù)據(jù)明文傳輸
2 對(duì)普通請(qǐng)求、返回?cái)?shù)據(jù),生成MD5校驗(yàn)(MD5中加入動(dòng)態(tài)密鑰),進(jìn)行數(shù)據(jù)完整性(簡(jiǎn)單防篡改,安全性較低,優(yōu)點(diǎn):快速)校驗(yàn)。 
3 對(duì)于重要數(shù)據(jù),使用RSA進(jìn)行數(shù)字簽名,起到防篡改作用。
4 對(duì)于比較敏感的數(shù)據(jù),如用戶(hù)信息(登陸、注冊(cè)等),客戶(hù)端發(fā)送使用RSA加密,服務(wù)器返回使用DES(AES)加密。
原因:客戶(hù)端發(fā)送之所以使用RSA加密,是因?yàn)镽SA解密需要知道服務(wù)器私鑰,而服務(wù)器私鑰一般盜取難度較大;如果使用DES的話(huà),可以通過(guò)破解客戶(hù)端獲 取密鑰,安全性較低。而服務(wù)器返回之所以使用DES,是因?yàn)椴还苁褂肈ES還是RSA,密鑰(或私鑰)都存儲(chǔ)在客戶(hù)端,都存在被破解的風(fēng)險(xiǎn),因此,需要采 用動(dòng)態(tài)密鑰,而RSA的密鑰生成比較復(fù)雜,不太適合動(dòng)態(tài)密鑰,并且RSA速度相對(duì)較慢,所以選用DES)



把相關(guān)算法的代碼也貼一下吧 (其實(shí)使用一些成熟的第三方庫(kù)或許會(huì)來(lái)得更加簡(jiǎn)單,不過(guò)自己寫(xiě),自由點(diǎn))。注,這里的大部分加密算法都是參考一些現(xiàn)有成熟的算法,或者直接拿來(lái)用的。
1、MD5   
//因?yàn)槭鞘褂胏ategory,所以木有參數(shù)傳入啦

-(NSString *) stringFromMD5 {
    if(self == nil || [self length] == ) {
        return nil;
    }
    const char *value = [self UTF8String];
    unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
    CC_MD5(value, strlen(value), outputBuffer);
    NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for(NSInteger count = ; count < CC_MD5_DIGEST_LENGTH; count++){
        [outputString appendFormat:@"%02x",outputBuffer[count]];
    }
    return [outputString autorelease];
}


2、Base64

+ (NSString *) base64EncodeData: (NSData *) objData {
const unsigned char * objRawData = [objData bytes];
char * objPointer;
char * strResult;

// Get the Raw Data length and ensure we actually have data
int intLength = [objData length];
if (intLength == ) return nil;

// Setup the String-based Result placeholder and pointer within that placeholder
strResult = (char *)calloc(((intLength + 2) / 3) * 4, sizeof(char));
objPointer = strResult;

// Iterate through everything
while (intLength > 2) { // keep going until we have less than 24 bits
*objPointer++ = _base64EncodingTable[objRawData[] >> 2];
*objPointer++ = _base64EncodingTable[((objRawData[] & 0x03) << 4) + (objRawData[1] >> 4)];
*objPointer++ = _base64EncodingTable[((objRawData[1] & 0x0f) << 2) + (objRawData[2] >> 6)];
*objPointer++ = _base64EncodingTable[objRawData[2] & 0x3f];

// we just handled 3 octets (24 bits) of data
objRawData += 3;
intLength -= 3;
}

// now deal with the tail end of things
if (intLength != ) {
*objPointer++ = _base64EncodingTable[objRawData[] >> 2];
if (intLength > 1) {
*objPointer++ = _base64EncodingTable[((objRawData[] & 0x03) << 4) + (objRawData[1] >> 4)];
*objPointer++ = _base64EncodingTable[(objRawData[1] & 0x0f) << 2];
*objPointer++ = '=';
} else {
*objPointer++ = _base64EncodingTable[(objRawData[] & 0x03) << 4];
*objPointer++ = '=';
*objPointer++ = '=';
}
}

// Terminate the string-based result
*objPointer = '\0';

    NSString *rstStr = [NSString stringWithCString:strResult encoding:NSASCIIStringEncoding];
    free(objPointer);
    return rstStr;
}




3、AES
-(NSData*) EncryptAES: (NSString *) key {
    char keyPtr[kCCKeySizeAES256+1];
    bzero(keyPtr, sizeof(keyPtr));

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = ;
    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 = [content length];
    if (plainLen > maxPlainLen) {
        NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen);
        return nil;
    }

    void *plain = malloc(plainLen);
    [content getBytes:plain
               length:plainLen];

    size_t cipherLen = 128; // currently RSA key length is set to 128 bytes
    void *cipher = malloc(cipherLen);

    OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,
                                        plainLen, cipher, &cipherLen);

    NSData *result = nil;
    if (returnCode != ) {
        NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);
    }
    else {
        result = [NSData dataWithBytes:cipher
                                length:cipherLen];
    }

    free(plain);
    free(cipher);

    return result;
}

標(biāo)簽: 安全 代碼 服務(wù)器

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:php根據(jù)詞頻生成tag云

下一篇:PHP 文件本身操作