ios参数加密
㈠ 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代码加密。
㈡ 苹果手机应用加密怎么设置
1/7
点击手机屏幕上的【设置】
2/7
下拉点击页面上的【通用】
3/7
点击【访问限制】
4/7
点击【启用访问限制】
5/7
然后输入访问限制的密码
6/7
进入访问限制页面后,把想要加密的应用右边的允许开关关闭就可以了
7/7
点击打开手机上的设置点击通用点击访问限制点击启用访问限制输入访问限制密码点击想要加密的应用右边的允许开关关闭。
㈢ ios加密机制是什么为什么无法破解
用过苹果产品的年轻朋友们都知道,不管是手机,还是电脑,都会有着相应的iOS加密机制。这种加密机制能够很好的保护大家的隐私,而且也非常的安全。其实根据小编了解到的消息可以得知,这种加密机制就是利用整个存储芯片进行加密,然后再通过锁屏密码以及其他的一些东西,因此生成一个伪随机数。之所以无法破解,是因为芯片牢固封装在主板上。
因为小编自己就是苹果手机,如果输入锁屏密码错误达到了一定的次数之后,手机就会启动iOS加密机制,把所有的输入擦除掉。而且苹果全屏加密的密钥是储存在一个非常特殊的空间里面,其他人是无法发现的,即使被远程擦除掉,但是永远都拿不到钥匙。如果自己需要保密的东西比较多,或者想要隐藏的东西比较多,小编还是建议大家购买苹果产品的,虽然价格有些贵,但是使用起来真的非常好。
㈣ 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应用开发过程中如何加密、防内购破解等,简单加密方法
在大多数iOS应用在开发者看来,封闭的iOS系统很安全,iOS应用也很安全,但事实上,iOS应用没有我们想象中的安全。如同安卓应用,iOS应用也面临着被破解的威胁,存在大量盗版情况,所以开发者对此一定要重视起来,应用在上市场之前还是要多做些相关的防护,例如:
1.本地数据加密
对NSUserDefaults,sqlite存储文件数据加密,保护帐号和关键信息。
2. URL编码加密
对程序中出现的URL进行编码加密,防止URL被静态分析
3. 网络传输数据加密
对客户端传输数据提供加密方案,有效防止通过网络接口的拦截获取
4. 方法体,方法名高级混淆
对应用程序的方法名和方法体进行混淆,保证源码被逆向后无法解析代码
5. 程序结构混排加密
对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低
㈦ ios 怎么对字符串进行aes加密
AES是块加密,每次都是对固定长度的数据进行加密,不够的就需要补了,太长的话,就需要搞成两次运算。所以你需要看看是不是需要分成两次加密运算。
㈧ iOS开发中哪些地方需要加密啊
涉及加密都是些敏感信息,这个很大程度取决于业务上的需求,比如用户身份证,手机号码、护照等信息。不涉及业务的,其实也有一些,常用的就是网络请求参数加密,配合接口返回解密,本地数据库加密,文件加密。要做手势密码等交互,也需要加密,还可以做下代码的混淆,程序进入后台时界面处理。
㈨ 怎么在ios进行rsa公钥加密,java做rsa私钥解密
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); KeyPair key = keyGen.generateKeyPair(); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); //把第二个参数改为 key.getPrivate() cipher.init(Cipher.ENCRYPT_MODE, key.getPublic()); byte[] cipherText = cipher.doFinal("Message".getBytes("UTF8")); System.out.println(new String(cipherText, "UTF8")); //把第二个参数改为key.getPublic() cipher.init(Cipher.DECRYPT_MODE, key.getPrivate()); byte[] newPlainText = cipher.doFinal(cipherText); System.out.println(new String(newPlainText, "UTF8")); 正常的用公钥加密私钥解密就是这个过程,如果按私钥加密公钥解密,只要按备注改2个参数就可以。 但是我要提醒楼主,你要公钥解密,公钥是公开的,相当于任何人都查到公钥可以解密。 你是想做签名是吧。