iOS 开发学习成长之路iOS Network征服iOS

iOS常见的几种加密方法

2016-02-19  本文已影响22708人  si1ence

本文中所有代码演示均有GitHub源码,点击下载

一. base64加密

将文件进行加密

    // 获取需要加密文件的二进制数据
    NSData *data = [NSData dataWithContentsOfFile:@"/Users/wangpengfei/Desktop/photo/IMG_5551.jpg"];

    // 或 base64EncodedStringWithOptions
    NSData *base64Data = [data base64EncodedDataWithOptions:0];

    // 将加密后的文件存储到桌面
    [base64Data writeToFile:@"/Users/wangpengfei/Desktop/123" atomically:YES];

将文件进行解密

    // 获得加密后的二进制数据
    NSData *base64Data = [NSData dataWithContentsOfFile:@"/Users/wangpengfei/Desktop/123"];

    // 解密 base64 数据
    NSData *baseData = [[NSData alloc] initWithBase64EncodedData:base64Data options:0];

    // 写入桌面
    [baseData writeToFile:@"/Users/wangpengfei/Desktop/IMG_5551.jpg" atomically:YES];

利用终端命令进行base64运算:

    // 将文件 meinv.jpg 进行 base64运算之后存储为 meinv.txt
    base64 meinv.jpg -o meinv.txt

    // 讲meinv.txt 解码生成 meinv.png
    base64 -D meinv.txt -o meinv.png

    // 将字符串 "hello" 进行 base 64 编码 结果:aGVsbG8=cho "hello" | base64

    // 将 base64编码之后的结果 aGVsbG8= 反编码为字符串
    echo aGVsbG8= | base64 -D

二. POST加密

A. 搭建UI框架

B. 实现基本加密

    - (void)readLocalUserInfo {
        // 1. 实例化偏好设置对象
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

        // 2. 取出数据进行赋值
        self.userName.text = [userDefaults objectForKey:kUserNameKey];

        // 此时读取的是加密后的密码
        self.password.text = [userDefaults objectForKey:kPasswordKey];
}
    - (void)saveLocalUserInfo {
        // 1. 实例化偏好设置对象
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

        // 2. 存储用户名
        [userDefaults setObject:self.userName.text forKey:kUserNameKey];

        // 3. 将密码进行base64 加密
        // 将密码转化为二进制数据
        NSData *data = [self.password.text dataUsingEncoding:NSUTF8StringEncoding];

        // 进行加密
        NSString *base64Str = [data base64EncodedStringWithOptions:0];

        // 4. 将加密后的密码存储到偏好设置
        [userDefaults setObject:base64Str forKey:kPasswordKey];

        // 5. 为了保证线程的一致性,无论是存储还是读取数据,都要进行同步
        [userDefaults synchronize];
}
    - (IBAction)btnLoginDidClick:(UIButton *)sender {
        // 如果两个文本框均不为空,则进行登录操作
        if (self.userName.text.length && self.password.text.length) {

            // 1. 创建请求
            NSString *urlString = @"http://localhost/login/login.php";

            NSURL *url = [NSURL URLWithString:urlString];

            // POST 请求需要手动设置请求方法,因此为可变请求
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

            // 设置请求方法
            request.HTTPMethod = @"POST";

            // 设置请求参数
            NSString *body = [NSString stringWithFormat:@"username=%@&password=%@", self.userName.text, self.password.text];

            // 将字符串转为二进制数据
            NSData *bodyData = [body dataUsingEncoding:NSUTF8StringEncoding];

            // 设置请求主体(二进制数据)
            request.HTTPBody = bodyData;

            // 2. 发送请求
            [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

                // 打印请求结果
                NSLog(@"data:%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

                // 判断是否登录成功
                if (data && !error) {
                    NSLog(@"网络请求成功!");

                    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

                    if (dict[@"userID"]) {
                        [self saveLocalUserInfo];
                    }
                    //跳转到app主界面,在主线程中发送通知
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [[NSNotificationCenter defaultCenter] postNotificationName:@"loginSuccess" object:nil];
                    });
                } else {
                    NSLog(@"网络请求失败!");
                }
            }] resume];
        } else {
            NSLog(@"用户名或密码不能为空!");
        }
    }

C. 实现页面间跳转

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

        // 1. 注册登录成功的通知观察者
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginSuccess) name:@"loginSuccess" object:nil];

        // 2. 注册登录成功的通知观察者
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(logoutSuccess) name:@"logoutSuccess" object:nil];

        // 每次app打开后,应该展示给用户哪个界面
        // 3. 利用偏好设置中用户保存的信息来判断用户的登录状态
        NSString *userName = [[NSUserDefaults standardUserDefaults] objectForKey:kUserNameKey];

        NSString *password = [[NSUserDefaults standardUserDefaults] objectForKey:kPasswordKey];

        if (userName && password) {
            // 显示app 主界面
            [self loginSuccess];
        } else {

            [self logoutSuccess];
        }

        return YES;
    }
    - (void)loginSuccess {

        NSLog(@"登录成功!");

        // 获取主界面
        UIStoryboard *mainSb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

        // 切换控制器
        self.window.rootViewController = mainSb.instantiateInitialViewController;
    }
    - (void)logoutSuccess {
        NSLog(@"注销成功!");

        // 获取登录界面
        UIStoryboard *loginSb = [UIStoryboard storyboardWithName:@"Login" bundle:nil];

        // 切换控制器
        self.window.rootViewController = loginSb.instantiateInitialViewController;
    }
    // 1. 清除本地信息
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kUserNameKey];

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kPasswordKey];

    // 同步信息
    [[NSUserDefaults standardUserDefaults] synchronize];

    // 2. 发送信息,切换控制器
    [[NSNotificationCenter defaultCenter] postNotificationName:@"logoutSuccess" object:nil];

三. Token值介绍

四. MD5加密--(信息-摘要算法) 哈希算法之一

把一个任意长度的字节串变换成一定长度的十六进制的大整数.

注意,字符串的转换过程是不可逆的,不能通过加密结果,反向推导出原始内容

基本介绍

使用方法

    NSString *password = @"WangPengfei";

    password = [password md5String];

    NSLog(@"password1:%@", password);
    NSString *salt = @"234567890-!@#$%^&*()_+QWERTYUIOP{ASDFGHJKL:XCVBNM<>";

    [password stringByAppendingString:salt];

    password = [password md5String];

    NSLog(@"password2:%@", password);

每一个公司都有自己的“盐值”,盐值越复杂,越安全

五. 时间戳密码

基本介绍

使用步骤

    // 1. 当前密码
    NSString *password = @"zhang";

    // 2. hmacKey值,是对“WangPengfei” 进行 MD5加密之后的值(动态生成的)
    NSString *hmacKey = @"d3bba33b51acaa0a272de7a2f6dfa233";
    // 1. 第一次加密:第一次 HMAC 运算
    password = [password hmacMD5StringWithKey:hmacKey];

    // 2.1 获得当前的时间
    NSDate *date = [NSDate date];

    // 2.2 获得当前时间的字符串
    // 实例化时间格式器
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

    // 设置时间格式
    formatter.dateFormat = @"yyyy-MM-dd HH:mm";

    // 获取当前时间(要和服务器保持一致)
    NSString *dateStr = [formatter stringFromDate:date];

    // 3. 将第一次加密后的密码与当前时间的字符串拼接在一起
    password = [password stringByAppendingString:dateStr];

    // 4. 进行第二次 HMAC 加密
    password = [password hmacMD5StringWithKey:hmacKey];
    NSURL *url = [NSURL URLWithString:@"http://localhost/login/loginhmac.php"];

    // POST 要手动设置方法,因此为可变
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    // 设置请求方法
    request.HTTPMethod = @"POST";

    // 设置请求体内容
    NSString *body = [NSString stringWithFormat:@"username=zhangsan&password=%@", password];
    request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }] resume];

六. 钥匙串访问

基本介绍

简单使用

    // 获取应用程序唯一标识.
    NSString *bundleId = [NSBundle mainBundle].bundleIdentifier;

    // 利用第三方框架,将用户密码保存在钥匙串
    [SSKeychain setPassword:self.pwdText.text forService:bundleId account:@"wpf"];
self.pwdText.text = [SSKeychain passwordForService:bundleId account:@"wpf"];

七. 指纹识别

简单介绍

使用步骤

    #import <LocalAuthentication/LocalAuthentication.h>
    float version = [UIDevice currentDevice].systemVersion.floatValue;

    if (version < 8.0 ) // 判断当前系统版本 {
        NSLog(@"系统版本太低,请升级至最新系统");
        return;
    }
    // 1> 实例化指纹识别对象
    LAContext *laCtx = [[LAContext alloc] init];

    // 2> 判断当前设备是否支持指纹识别功能.
    if (![laCtx canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:NULL]) {

        // 如果设备不支持指纹识别功能
        NSLog(@"该设备不支持指纹识别功能");

        return;
    };
    [laCtx evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"指纹登陆" reply:^(BOOL success, NSError *error) {
        // 如果成功,表示指纹输入正确.
        if (success) {
            NSLog(@"指纹识别成功!");

        } else {
            NSLog(@"指纹识别错误,请再次尝试");
        }
    }];
上一篇下一篇

猜你喜欢

热点阅读