⑴ ios怎麼實現RAS加密解密
轉載最近幾天折騰了一下如何在iOS上使用RSA來加密。iOS上並沒有直接的RSA加密API。但是iOS提供了x509的API,而x509是支持RSA加密的。因此,我們可以通過製作自簽名的x509證書(由於對安全性要求不高,我們並不需要使用CA認證的證書),再調用x509的相關API來進行加密。接下來記錄一下整個流程。
第一步,製作自簽名的證書
1.最簡單快捷的方法,打開Terminal,使用openssl(Mac OS X自帶)生成私鑰和自簽名的x509證書。
openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650
按照命令行的提示輸入內容就行了。
幾個說明:
public_key.der是輸出的自簽名的x509證書,即我們要用的。
private_key.pem是輸出的私鑰,用來解密的,請妥善保管。
rsa:1024這里的1024是密鑰長度,1024是比較安全的,如果需要更安全的話,可以用2048,但是加解密代價也會增加。
-days:證書過期時間,一定要加上這個參數,默認的證書過期時間是30天,一般我們不希望證書這么短就過期,所以寫上比較合適的天數,例如這里的3650(10年)。
事實上,這一行命令包含了好幾個步驟(我研究下面這些步驟的原因是我手頭已經由一個private_key.pem私鑰了,想直接用這個來生成x509證書,也就是用到了下面的2-3)
1)創建私鑰
openssl genrsa -out private_key.pem 1024
2)創建證書請求(按照提示輸入信息)
openssl req -new -out cert.csr -key private_key.pem
3)自簽署根證書
openssl x509 -req -in cert.csr -out public_key.der -outform der -signkey private_key.pem -days 3650
2.驗證證書。把public_key.der拖到xcode中,如果文件沒有問題的話,那麼就可以直接在xcode中打開,看到證書的各種信息。
第二步,使用public_key.der來進行加密。
1.導入Security.framework。
2.把public_key.der放到mainBundle中(一般直接拖到Xcode就行啦)。
3.從public_key.der讀取公鑰。
4.加密。
下面是參考代碼(只能用於加密長度小於等於116位元組的內容,適合於對密碼進行加密。使用了ARC,不過還是要注意部分資源需要使用CFRealse來釋放)
RSA.h
//
// RSA.h
//
#import <Foundation/Foundation.h>
@interface RSA : NSObject {
SecKeyRef publicKey;
SecCertificateRef certificate;
SecPolicyRef policy;
SecTrustRef trust;
size_t maxPlainLen;
}
- (NSData *) encryptWithData:(NSData *)content;
- (NSData *) encryptWithString:(NSString *)content;
@end
RSA.m
//
// RSA.m
//
#import "RSA.h"
@implementation RSA
- (id)init {
self = [super init];
NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key"
ofType:@"der"];
if (publicKeyPath == nil) {
NSLog(@"Can not find pub.der");
return nil;
}
NSDate *publicKeyFileContent = [NSData dataWithContentsOfFile:publicKeyPath];
if (publicKeyFileContent == nil) {
NSLog(@"Can not read from pub.der");
return nil;
}
certificate = SecCertificateCreateWithData(kCFAllocatorDefault, ( __bridge CFDataRef)publicKeyFileContent);
if (certificate == nil) {
NSLog(@"Can not read certificate from pub.der");
return nil;
}
policy = SecPolicyCreateBasicX509();
OSStatus returnCode = (certificate, policy, &trust);
if (returnCode != 0) {
NSLog(@" fail. Error Code: %ld", returnCode);
return nil;
}
SecTrustResultType trustResultType;
returnCode = SecTrustEvaluate(trust, &trustResultType);
if (returnCode != 0) {
NSLog(@"SecTrustEvaluate fail. Error Code: %ld", returnCode);
return nil;
}
publicKey = SecTrustCopyPublicKey(trust);
if (publicKey == nil) {
NSLog(@"SecTrustCopyPublicKey fail");
return nil;
}
maxPlainLen = SecKeyGetBlockSize(publicKey) - 12;
return self;
}
- (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; // 當前RSA的密鑰長度是128位元組
void *cipher = malloc(cipherLen);
OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,
plainLen, cipher, &cipherLen);
NSData *result = nil;
if (returnCode != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen];
}
free(plain);
free(cipher);
return result;
}
- (NSData *) encryptWithString:(NSString *)content {
return [self encryptWithData:[content dataUsingEncoding:NSUTF8StringEncoding]];
}
- (void)dealloc{
CFRelease(certificate);
CFRelease(trust);
CFRelease(policy);
CFRelease(publicKey);
}
@end
使用方法:
RSA *rsa = [[RSA alloc] init];
if (rsa != nil) {
NSLog(@"%@",[rsa encryptWithString:@"test"]);
}
else {
NSLog(@"init rsa error");
}
⑵ iOS代碼加密的幾種方式
眾所周知的是大部分iOS代碼一般不會做加密加固,因為iOS
APP一般是通過AppStore發布的,而且蘋果的系統難以攻破,所以在iOS里做代碼加固一般是一件出力不討好的事情。萬事皆有例外,不管iOS、adr還是js,加密的目的是為了代碼的安全性,雖然現在開源暢行,但是不管個人開發者還是大廠皆有保護代碼安全的需求,所以iOS代碼加固有了生存的土壤。下面簡單介紹下iOS代碼加密的幾種方式。
iOS代碼加密的幾種方式
1.字元串加密
字元串會暴露APP的很多關鍵信息,攻擊者可以根據從界面獲取的字元串,快速找到相關邏輯的處理函數,從而進行分析破解。加密字元串可以增加攻擊者閱讀代碼的難度以及根據字元串靜態搜索的難度。
一般的處理方式是對需要加密的字元串加密,並保存加密後的數據,再在使用字元串的地方插入解密演算法。簡單的加密演算法可以把NSString轉為byte或者NSData的方式,還可以把字元串放到後端來返回,盡量少的暴露頁面信息。下面舉個簡單例子,把NSString轉為16進制的字元串:
2.符號混淆
符號混淆的中心思想是將類名、方法名、變數名替換為無意義符號,提高應用安全性;防止敏感符號被class-mp工具提取,防止IDA Pro等工具反編譯後分析業務代碼。目前市面上的IOS應用基本上是沒有使用類名方法名混淆的。
別名
在編寫代碼的時候直接用別名可能是最簡單的一種方式,也是比較管用的一種方式。因為你的app被破解後,假如很容易就能從你的類名中尋找到蛛絲馬跡,那離hook只是一步之遙,之前微信搶紅包的插件應該就是用hook的方式執行的。
b.C重寫
編寫別名的方式不是很易讀,而且也不利於後續維護,這時你可能需要升級一下你的保護方式,用C來重寫你的代碼吧。這樣把函數名隱藏在結構體中,用函數指針成員的形式存儲,編譯後,只留下了地址,去掉了名字和參數表,讓他們無從下手( from 念茜)。如下例子:
c.腳本處理
稍微高級一點的是腳本掃描處理替換代碼,因為要用到linux命令來編寫腳本,可能會有一點門檻,不過學了之後你就可以出去吹噓你全棧工程師的名頭啦。。。
linux腳本比較常用的幾個命令如下:
腳本混淆替換是用上述幾個命令掃描出來需要替換的字元串,比如方法名,類名,變數名,並做替換,如果你能熟練應用上述幾個命令,恭喜你,已經了解了腳本的一點皮毛了。
如以下腳本搜索遍歷了代碼目錄下的需要混淆的關鍵字:
替換的方式可以直接掃描文件並對文件中的所有內容替換,也可以採用define的方式定義別名。例如:
d.開源項目ios-class-guard
該項目是基於class-mp的擴展,和腳本處理類似,是用class-mp掃描出編譯後的類名、方法名、屬性名等並做替換,只是不支持隱式C方法的替換,有興趣的同學可以使用下。
3.代碼邏輯混淆
代碼邏輯混淆有以下幾個方面的含義:
對方法體進行混淆,保證源碼被逆向後該部分的代碼有很大的迷惑性,因為有一些垃圾代碼的存在;
對應用程序邏輯結構進行打亂混排,保證源碼可讀性降到最低,這很容易把破解者帶到溝里去;
它擁有和原始的代碼一樣的功能,這是最最關鍵的。
一般使用obfuscator-llvm來做代碼邏輯混淆,或許會對該開源工具做個簡單介紹。
4.加固SDK
adr中一般比較常見的加固等操作,iOS也有一些第三方提供這樣的服務,但是沒有真正使用過,不知道效果如何。
當然還有一些第三方服務的加固產品,基本上都是採用了以上一種或幾種混淆方式做的封裝,如果想要直接可以拿來使用的服務,可以採用下,常用的一些服務如下:
幾維安全
iOS加密可能市場很小,但是存在必有道理,在越獄/開源/極客的眼中,你的APP並沒有你想像的那麼安全,如果希望你的代碼更加安全,就應給iOS代碼加密。
⑶ ios12應用如何加密
使用第三方的加密軟體進行加密
注意:你的密碼管理器需要針對iOS 12進行更新。你的設備還需要運行iOS 12或更高版本。在iOS 12正式版推出之前,蘋果不接受使用iOS 12 SDK的應用程序。
1.確保你的密碼管理器已針對iOS 12和自動填充密碼進行了更新。
2.啟動設置>密碼和賬戶>自動填寫密碼。
3.確保已啟用「自動填充密碼」。現在,第二方自動填充密碼應用列表應與iCloud Keychain一起顯示。
4.點按該應用可為該應用啟用密碼自動填充功能。注意:你可以在任何給定時間使用多個密碼自動填充應用程序,包括iCloud Keychain。下次嘗試在應用程序或Safari中自動填充密碼時,你現在可以從第三方應用程序中獲取數據。
⑷ ios 9.3的加密功能將更加強大,可以在應用層面進行分別加密是什麼意思
IOS9.3包括了Night Shift模式、Touch ID加密備忘錄、新的Classroom應用以及增強的3D Touch功能。
1、NightShift
iOS9.3的Night Shift功能對於孩子們來說非常有用,如果你經常在睡前用iPhone或iPad為孩子講故事,那麼原本普通的屏幕發出的藍光會影響孩子的睡眠。而Night Shift模式則可以根據時間自動調整屏幕色溫,在夜間帶來更柔和的屏幕光線,不會影響孩子入睡。
2、Touch ID加密備忘錄
在iOS9.3系統中,備忘錄功能也提升了不少,除了可以集成到第三方App、支持塗鴉和照片之外,加入對Touch ID的支持也進一步提升了安全性。
用戶可以直接通過備忘錄來保存重要的數據和密碼,同時這樣也不會被孩子輕易發現。如果是在聖誕節期間,將禮物清單記在備忘錄中,可以帶來不小的驚喜。
3、教育
針對iPad用戶,iOS9.3也加強的教育功能,孩子可以在學校遠程登錄並方位自己的iPad配置文件,只有四位密碼的加密方式也可以讓年齡更小的孩子直接使用。同時,教師們還可以通過新的工具來更順暢的教授課程。
⑸ IOS中怎麼做RSA加密演算法
RSA加密以及解密實現步驟:
1、使用openssl生成密匙對。
代碼如下:(代碼源於github開源社區)
#!/usr/bin/envbash
echo"GeneratingRSAkeypair..."
echo"1024RSAkey:private_key.pem"
opensslgenrsa-outprivate_key.pem1024
echo":rsaCertReq.csr"
opensslreq-new-keyprivate_key.pem-outrsaCertReq.csr
echo"createcertificationusingx509:rsaCert.crt"
opensslx509-req-days3650-inrsaCertReq.csr-signkeyprivate_key.pem-outrsaCert.crt
echo"createpublic_key.derForIOS"
opensslx509-outformder-inrsaCert.crt-outpublic_key.der
echo"createprivate_key.p12ForIOS.Pleaserememberyourpassword.ThepasswordwillbeusediniOS."
opensslpkcs12-export-outprivate_key.p12-inkeyprivate_key.pem-inrsaCert.crt
echo"creatersa_public_key.pemForJava"
opensslrsa-inprivate_key.pem-outrsa_public_key.pem-pubout
echo"createpkcs8_private_key.pemForJava"
opensslpkcs8-topk8-inprivate_key.pem-outpkcs8_private_key.pem-nocrypt
echo"finished."
2、載入證書後即可進行加密演算法。
代碼:
RSAEncryptor*rsa=[[RSAEncryptoralloc]init];
NSLog(@"encryptorusingrsa");
NSString*publicKeyPath=[[NSBundlemainBundle]pathForResource:@"public_key"ofType:@"der"];
NSLog(@"publickey:%@",publicKeyPath);
[rsaloadPublicKeyFromFile:publicKeyPath];
NSString*securityText=@"hello~";
NSString*encryptedString=[rsarsaEncryptString:securityText];
NSLog(@"encrypteddata:%@",encryptedString);
對應解密代碼:
NSLog(@"decryptorusingrsa");
[rsaloadPrivateKeyFromFile:[[NSBundlemainBundle]pathForResource:@"private_key"ofType:@"p12"]password:@"123456"];
NSString*decryptedString=[rsarsaDecryptString:encryptedString];
NSLog(@"decrypteddata:%@",decryptedString);
RSA基本原理:
RSA使用"秘匙對"對數據進行加密解密.在加密解密數據前,需要先生成公鑰(public key)和私鑰(private key)。
公鑰(public key): 用於加密數據. 用於公開, 一般存放在數據提供方, 例如iOS客戶端。
私鑰(private key): 用於解密數據. 必須保密, 私鑰泄露會造成安全問題。
⑹ ios 中開發中用戶信息中的加密方式有哪些
5.1 通過簡單的URLENCODE + BASE64編碼防止數據明文傳輸
5.2 對普通請求、返回數據,生成MD5校驗(MD5中加入動態密鑰),進行數據完整性(簡單防篡改,安全性較低,優點:快速)校驗。
5.3 對於重要數據,使用RSA進行數字簽名,起到防篡改作用。
5.4 對於比較敏感的數據,如用戶信息(登陸、注冊等),客戶端發送使用RSA加密,伺服器返回使用DES(AES)加密。
原因:客戶端發送之所以使用RSA加密,是因為RSA解密需要知道伺服器私鑰,而伺服器私鑰一般盜取難度較大;如果使用DES的話,可以通過破解客戶端獲取密鑰,安全性較低。而伺服器返回之所以使用DES,是因為不管使用DES還是RSA,密鑰(或私鑰)都存儲在客戶端,都存在被破解的風險,因此,需要採用動態密鑰,而RSA的密鑰生成比較復雜,不太適合動態密鑰,並且RSA速度相對較慢,所以選用DES)
把相關演算法的代碼也貼一下吧 (其實使用一些成熟的第三方庫或許會來得更加簡單,不過自己寫,自由點)。注,這里的大部分加密演算法都是參考一些現有成熟的演算法,或者直接拿來用的。
1、MD5
//因為是使用category,所以木有參數傳入啦
-(NSString *) stringFromMD5 {
if(self == nil || [self length] == 0) {
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 = 0; 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 == 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';
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 = 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 = [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 != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen];
}
free(plain);
free(cipher);
return result;
}
⑺ 蘋果手機怎麼設置應用加密
很多用戶在使用智能手機的過程中都會在手機應用中儲存一些隱私信息,然後給這些應用加密,這樣就不用擔心自己的隱私會被別人偷看到了。應用加密這個操作在安卓系統的手機中設置起來非常的簡單,用戶比較容易上手,但是在蘋果手機的iOS系統中,很多用戶都不知道有應用加密這個功能,更不要說自己來設置了,介於還有很多用戶不知道要如何設置,小編今天就來跟大家分享一下具體的方法步驟,有需要的朋友趕緊一起來看一看吧,希望能夠幫助到大家。
方法步驟
1.在蘋果手機中給應用程序加密的話我們是可以通過手機內的APP或者系統程序來設置的,可以使用到手機中的一些系統程序進行加密。
2.首先第一步進入手機之後我們需要在界面中找到設置圖標,點擊進入到設置中之後,在設置界面找到通用這個選項,然後點擊進去。
3.點擊到通用界面之後,我們在界面列表中找到訪問限制這個選項,然後點擊到訪問限制界面中,這時需要輸入訪問限制的密碼。
4.密碼輸入完成之後我們就可以開始為應用「上鎖」了,在界面的下方會出現手機上的所有應用,然後我們將想要加密的應用程序後面的開關開啟就可以了。
以上就是在蘋果手機中為應用程序加密的方法步驟了,有很多朋友在使用蘋果手機的時候都不知道蘋果系統中也有為應用程序加密的功能,所以很多用戶都不會,如果你的蘋果手機也需要這個操作的話,不妨試一試上述方法。
⑻ 如何在IOS中使用RSA加密,能夠與.NET的伺服器互通
在 ios 上你需要使用證書加密。
首先生成一張證書。微軟的.Net framework SDK為我們提供了一個生成X.509數字證書的命令行工具Makecert.exe。
打開.Net的控制台,使用如下命令生成證書:
makecert -sr LocalMachine -ss My -n CN=Theoservice -sky exchange -pe
然後,開始->運行->MMC,打開MMC控制台。文件->添加/刪除管理單元->添加按鈕->選」證書」->添加->選」計算機賬戶」->關閉->確定,然後你就可以在 「個人->證書」 里看到剛才生成的證書了。證書採用1024位密鑰加密。現在,你需要做得就是導出這張證書。如果你的伺服器並不是本機,你首先需要導出一個帶私鑰的pfx格式的證書。導出時需要你填寫密碼來保護這張證書,然後將其導入到伺服器上就好了。此外,你還需要導出一份不帶私鑰的cer格式的證書。這張證書只含有公鑰,是用來和客戶端一起發布出去用來加密數數據的。
證書有了以後就是加密解密。C#程序,估計這個你已經寫過。
然後將導出的證書導入到你的 IOS程序中,寫相應的程序。
注意:RSA分組加密是採用了1024位的密鑰,所以密鑰長度為1024/8=128個byte。而C#默認採用#PKSC1的padding模式,每次最多可以加密128-11=117個byte。也就是說,RSA分組加密演算法每次從明文里取<=117個byte,然後加密成128個byte的密文;解密的時候,每次就取128個byte的密文,將其解密成<=117個byte的明文。因為#PKSC1的padding模式每次padding的內容是隨機的,所以即使是加密同一段明文,每次的結果也不一樣,這大大的增加了數據安全性。
ios端:就是每次取117個byte的明文並加密成128個byte的密文,最後連起來做base64編碼。
⑼ ios應用開發過程中如何加密、防內購破解等,簡單加密方法
在大多數iOS應用在開發者看來,封閉的iOS系統很安全,iOS應用也很安全,但事實上,iOS應用沒有我們想像中的安全。如同安卓應用,iOS應用也面臨著被破解的威脅,存在大量盜版情況,所以開發者對此一定要重視起來,應用在上市場之前還是要多做些相關的防護,例如:
1.本地數據加密
對NSUserDefaults,sqlite存儲文件數據加密,保護帳號和關鍵信息。
2. URL編碼加密
對程序中出現的URL進行編碼加密,防止URL被靜態分析
3. 網路傳輸數據加密
對客戶端傳輸數據提供加密方案,有效防止通過網路介面的攔截獲取
4. 方法體,方法名高級混淆
對應用程序的方法名和方法體進行混淆,保證源碼被逆向後無法解析代碼
5. 程序結構混排加密
對應用程序邏輯結構進行打亂混排,保證源碼可讀性降到最低
⑽ ios加密方式,常用的加密方式
被拒的原因有以下這些: 1. 條款和條件 1.1 為App Store開發程序,開發者必須遵守 Program License Agreement (PLA)、人機交互指南(HIG)以及開發者和蘋果簽訂的任何協議和合同。以下規則和示例旨在幫助開發者的程序能獲得App Store的認可