⑴ 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的认可