目前分類:安全類 (12)

瀏覽方式: 標題列表 簡短摘要

雖則過往蘋果的Find My iPhone功能,曾協助不少人找回失機,但今日有一段新影片亮相後,大家可能要小心一點,也不能全靠這項功能了。因為這段新影片揭示,Find My iPhone存在嚴重漏洞,很容易就可以停用。任何人似乎只要有機會進入設定,然後按iCloud戶口,按過幾次錯誤密碼後,再把簡介清除,Find My iPhone就會突然關閉。據稱,目前正在測試的iOS 7.1並無此問題,估計蘋果可能早知道此情況,並已完成修正。另外,對方或賊人亦要有機會進入手機的設定,才有可能做上述動作把Find My iPhone關閉。


shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()

     我們在開發iPad和iPad程序時,都會將程序使用的圖片及數據文件放入我們http://的工程當中,然後編譯、發布程序。
當我們使用其它工具打開ipa包時,我們就會看到這些圖片和數據文件,同样,也可以提取出這些文件,那麼如何讓其它人看到這些文件,但是看不到這些文件的內容呢。

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()

/****************************md5加密************************************/

+ (NSString *) md5:(NSString *)str

{

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()

opensslshiy流程:
1.初始化; SSLv23_client_method();創建SSL上下文環境 SSL_CTX_new ()
2.創建socket,connect;校驗證書;

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()

最近在iphone開發中,在和伺服器端傳遞資料時,需要對密碼進行md5加密,代碼很簡單:
-(NSString *)md5:(NSString *)str {
const char *cStr = [str UTF8String];

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()

通過Luhn演算法校驗的過程:
1、從卡號最後一位數位開始,逆向將奇數位(1、3、5等等)相加。
2、從卡號最後一位數位開始,逆向將偶數位數位,先乘以2(如果乘積為兩位數,則將其減去9),再求和。

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()

從C++而來,當然我們的objective-c也是可以用的。
const int factor[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };//加權因數
const int checktable[] = { 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 };//校驗值對應表

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()


/*
Base64Code.h
*/

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()

// // Utility.h // TheDealersForum // // Created by Hailong Zhang on 5/3/11. // Copyright 2011 Personal. All rights reserved. // #import #import #import @interface Utility : NSObject { } + (NSString *) udid; + (NSString *) md5:(NSString *)str; + (NSString *) doCipher:(NSString *)sTextIn key:(NSString *)sKey context:(CCOperation)encryptOrDecrypt; + (NSString *) encryptStr:(NSString *) str; + (NSString *) decryptStr:(NSString *) str; #pragma mark Based64 + (NSString *) encodeBase64WithString:(NSString *)strData; + (NSString *) encodeBase64WithData:(NSData *)objData; + (NSData *) decodeBase64WithString:(NSString *)strBase64; @end

 

// // Utility.m // TheDealersForum // // Created by Hailong Zhang on 5/3/11. // Copyright 2011 Personal. All rights reserved. // #import "Utility.h" static NSString *_key = @"12345678"; static const char _base64EncodingTable[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const short _base64DecodingTable[256] = { -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -2, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, -2, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -2, -2, -2, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, -2, -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2 }; @implementation Utility + (NSString *) udid { return [Utility encryptStr:[[UIDevice currentDevice] uniqueIdentifier]]; } + (NSString *) md5:(NSString *)str { const char *cStr = [str UTF8String]; unsigned char result[CC_MD5_DIGEST_LENGTH]; CC_MD5( cStr, strlen(cStr), result ); return [NSString stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15] ]; } + (NSString *) encryptStr:(NSString *) str { return [Utility doCipher:str key:_key context:kCCEncrypt]; } + (NSString *) decryptStr:(NSString *) str { return [Utility doCipher:str key:_key context:kCCDecrypt]; } + (NSString *)doCipher:(NSString *)sTextIn key:(NSString *)sKey context:(CCOperation)encryptOrDecrypt { NSStringEncoding EnC = NSUTF8StringEncoding; NSMutableData * dTextIn; if (encryptOrDecrypt == kCCDecrypt) { dTextIn = [[Utility decodeBase64WithString:sTextIn] mutableCopy]; } else{ dTextIn = [[sTextIn dataUsingEncoding: EnC] mutableCopy]; } NSMutableData * dKey = [[sKey dataUsingEncoding:EnC] mutableCopy]; [dKey setLength:kCCBlockSizeDES]; uint8_t *bufferPtr1 = NULL; size_t bufferPtrSize1 = 0; size_t movedBytes1 = 0; //uint8_t iv[kCCBlockSizeDES]; //memset((void *) iv, 0x0, (size_t) sizeof(iv)); Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; bufferPtrSize1 = ([sTextIn length] + kCCKeySizeDES) & ~(kCCKeySizeDES -1); bufferPtr1 = malloc(bufferPtrSize1 * sizeof(uint8_t)); memset((void *)bufferPtr1, 0x00, bufferPtrSize1); CCCrypt(encryptOrDecrypt, // CCOperation op kCCAlgorithmDES, // CCAlgorithm alg kCCOptionPKCS7Padding, // CCOptions options [dKey bytes], // const void *key [dKey length], // size_t keyLength iv, // const void *iv [dTextIn bytes], // const void *dataIn [dTextIn length], // size_t dataInLength (void *)bufferPtr1, // void *dataOut bufferPtrSize1, // size_t dataOutAvailable &movedBytes1); // size_t *dataOutMoved NSString * sResult; if (encryptOrDecrypt == kCCDecrypt){ sResult = [[[ NSString alloc] initWithData:[NSData dataWithBytes:bufferPtr1 length:movedBytes1] encoding:EnC] autorelease]; } else { NSData *dResult = [NSData dataWithBytes:bufferPtr1 length:movedBytes1]; sResult = [Utility encodeBase64WithData:dResult]; } return sResult; } + (NSString *)encodeBase64WithString:(NSString *)strData { return [Utility encodeBase64WithData:[strData dataUsingEncoding:NSUTF8StringEncoding]]; } + (NSString *)encodeBase64WithData:(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 == 0) 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[0] >> 2]; *objPointer++ = _base64EncodingTable[((objRawData[0] & 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 != 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++ = '='; } } // Terminate the string-based result *objPointer = '/0'; // Return the results as an NSString object return [NSString stringWithCString:strResult encoding:NSASCIIStringEncoding]; } + (NSData *)decodeBase64WithString:(NSString *)strBase64 { const char * objPointer = [strBase64 cStringUsingEncoding:NSASCIIStringEncoding]; int intLength = strlen(objPointer); int intCurrent; int i = 0, j = 0, k; unsigned char * objResult; objResult = calloc(intLength, sizeof(char)); // Run through the whole string, converting as we go while ( ((intCurrent = *objPointer++) != '/0') && (intLength-- > 0) ) { if (intCurrent == '=') { if (*objPointer != '=' && ((i % 4) == 1)) {// || (intLength > 0)) { // the padding character is invalid at this point -- so this entire string is invalid free(objResult); return nil; } continue; } intCurrent = _base64DecodingTable[intCurrent]; if (intCurrent == -1) { // we're at a whitespace -- simply skip over continue; } else if (intCurrent == -2) { // we're at an invalid character free(objResult); return nil; } switch (i % 4) { case 0: objResult[j] = intCurrent << 2; break; case 1: objResult[j++] |= intCurrent >> 4; objResult[j] = (intCurrent & 0x0f) << 4; break; case 2: objResult[j++] |= intCurrent >>2; objResult[j] = (intCurrent & 0x03) << 6; break; case 3: objResult[j++] |= intCurrent; break; } i++; } // mop things up if we ended on a boundary k = j; if (intCurrent == '=') { switch (i % 4) { case 1: // Invalid state free(objResult); return nil; case 2: k++; // flow through case 3: objResult[k] = 0; } } // Cleanup and setup the return NSData NSData * objData = [[[NSData alloc] initWithBytes:objResult length:j] autorelease]; free(objResult); return objData; } @end

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()

開發者James Laird日前宣佈他破譯了蘋果Airport Express的私人金鑰,並公佈了一個開源Airport Express類比方法,被稱作Shareport。  這裡不討論破解的專業術語,簡單說一下到底破譯這個金鑰有什麼用:在之前,電腦端iTunes音樂通過無線傳輸到Airport Express,Arport Express再通過無線/有線傳輸到協力廠商軟體/硬體設備進行播放,在這裡Airport Express起到了一個仲介橋樑作用。 現在,如果使用開發者破解金鑰的類比方法,iTunes音樂可以直接——傳輸到協力廠商軟體或者硬體上播放了。 這像什麼?沒錯,就是蘋果的AirPlay技術,蘋果現在已經允許協力廠商廠商生產相容AirPlay技術的產品了,前提是經過蘋果的認證(交錢滴……)。所以這個開發者這次的“非官方”做法,也許就很少有產品開發商嘗試了。但對軟體發展者還是有一定用處的,iTunes音樂可以通過今後開發的某個軟體直接傳輸音樂到其他的非Mac電腦、移動設備上。此前有消息表示可能會有開發者把此功能添加到將來版本的VLC播放軟體中。

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()

#import <CommonCrypto/CommonCryptor.h>
#import "GTMBase64.h" // Open source,base64處理,就兩個檔,自己從網上下載下吧

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()

在應用裡保存帳號、密碼等資訊的話,直接存到 plist 裡顯然是不負責任的,自己折騰加密既麻煩又不能保證不被反編譯破解。實際上蘋果 iOS 和 Mac OS X 系統自帶了一套敏感資訊保存方案:"鑰匙串" (Keychain)。

用原生的 Security.framework 就可以實現鑰匙串的訪問、讀寫。但是只能在真機上進行,模擬器會出錯。在 Github 上有個封裝的非常好的類來實現這個功能,讓你既能在模擬器又能在真機上訪問鑰匙串。類的位址: http://github.com/ldandersen/scifihifi-iphone/tree/master/security

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()