zoukankan      html  css  js  c++  java
  • 加密

    加密方式

    1 base64

    1.1 简介

    Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个“=”。例:将对ABC进行BASE64编码首先取ABC对应的ASCII码值。A(65)B(66)C(67)。再取二进制值A(01000001)B(01000010)C(01000011),然后把这三个字节的二进制码接起来(010000010100001001000011),再以6位为单位分成4个数据块并在最高位填充两个0后形成4个字节的编码后的值(00010000)(00010100)(00001001)(00000011)。蓝色部分为真实数据。再把这四个字节数据转化成10进制数得(16)(20)(19)(3)。最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D)。这里的值实际就是数据在字符表中的索引。

    注:BASE64字符表:包括大写 A-Z 小写 a-z 数字 0-9 和+ /

    解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据.

    1.2 base64的加密原则

    base64加密原则: 6 bit(原8bit) 一个字节. 不足的位数 用0 补齐.两个0 用一个 = 表示.

    1.3 加密特点:数据加密之后,数据量会变大,变大 1/3 左右.

    1.4 使用步骤

    加密:

    1> 将要加密的数据转为二进制的 data

    2> [data base64EncodedDataWithOptions:0] 加密成二进制数据

    [data base64EncodedStringWithOptions:0] 加密成字符串数据

    3> 写入文件

    解密:

    1>    将要解密的文件转为二进制数据

    [str dataUsingEncoding:NSUTF8StringEncoding] //是字符串

    2>    [[NSData alloc] initWithBase64EncodedData:data options:0];

     [[NSData alloc] initWithBase64EncodedString:…]

    3>    写入文件

     

    2 MD5

    2.1 MD5简介

    MD5的全称是Message-DigestAlgorithm 5,Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数。请注意我使用了"字节串"而不是"字符串"这个词,是因为这种变换只与字节的值有关,与字符集或编码方式无关。 MD5将任意长度的"字节串"变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。

    MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被"篡改"。举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的"抵赖",这就是所谓的数字签名应用。

    MD5还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不"知道"用户的密码是什么。

    注: MD5加密是不可逆的,也就是说, MD5加密后是不能解密的,所谓的解密只是用大数据的”试用”,来测出结果的.

    2.2 加密方式

        NSString *password = @"zhang";

        password = [password md5String];

    注:单纯的 MD5加密是不安全的,因此要用到 MD5加盐的方式

    2.3 MD5加盐

    > 盐值:MD5加盐的值,加的盐值越高越好.(盐值可以随意添加)

    > 试用步骤:

    1> 生成盐值

    NSString *salt = @”盐值”;

    2> 拼接盐值

    password = [password stringByAppendingString:salt];

    3> 加密

    password = password.md5String;

    2.3 时间戳/动态密码

    1> 实现目标

    用户的密码是一定的,但是每次发送给网络的密码都不同.相同的密码相同的加密算法,每次获得的值不同.客户端和服务器端的时间是相同的.

    2> 原理

    客户端和服务器端依时间为基准采用相同的加密算法

    3> 实现细节

    • 客户端和服务器端要求时间一致
    • 时间精度越高,越安全
    • 客户端:发送网络请求的时候依当前时间为基准进行加密.
    • 服务器端:以接收到时间为基准进行加密.还要以接收到的时间的前一分钟时间为基准进行加密.
    • 服务器端:判断这两次的密码和客户端发送的密码是否一致.

    4> 实现步骤

    • 第一次hmac 加密

       password = [password hmacMD5StringWithKey:hmacKey];

    • 将加密后的值和时间进行拼接

    password = [password stringByAppendingString:timer];

    • 第二次加密

    password = [password hmacMD5StringWithKey:hmacKey];

    补充:

    DNS

    DES是Data Encryption Standard(数据加密标准)的缩写。DES是一个分组加密算法,他以64位为分组对数据加密。同时DES也是一个对称算法:加密和解密用的是同一个算法。它的密匙长度是56位(因为每个第8位都用作奇偶校验),密匙可以是任意的56位的数,而且可以任意时候改变。其中有极少量的数被认为是弱密匙,但是很容易避开他们。所以保密性依赖于密钥。

    DES对64(bit)位的明文分组M进行操作,M经过一个初始置换IP置换成m0,将m0明文分成左半部分和右半部分m0=(L0,R0),各32位长。然后进行16轮完全相同的运算,这些运算被称为函数f,在运算过程中数据与密匙结合。经过16轮后,左,右半部分合在一起经过一个末置换,这样就完成了。在每一轮中,密匙位移位,然后再从密匙的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,并通过一个异或操作替代成新的32位数据,在将其置换换一次。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复16次,就实现了。

    解密过程:在经过所有的代替、置换、异或盒循环之后,你也许认为解密算法与加密算法完全不同。恰恰相反,经过精心选择的各种操作,获得了一个非常有用的性质:加密和解密使用相同的算法。DES加密和解密唯一的不同是密匙的次序相反。如果各轮加密密匙分别是K1,K2,K3….K16那么解密密匙就是K16,K15,K14…K1。

    钥匙串存储--SSKeychain 第三方框架

    > 钥匙串:可以在钥匙串中直接写入明文密码,钥匙串比较安全

    钥匙串的存储

    1>    要写入的密码

     NSString *password = @"zhang";

    2>    取出应用的唯一标示符

    NSString *bundleID = [NSBundle mainBundle].bundleIdentifier;

    3>   写入

    [SSKeychain setPassword:password forService:bundleID account:kUserNameKey]

    钥匙串的读取:

    • 根据钥匙串的唯一标示符取出密码

    NSString *password = [SSKeychain passwordForService:bundleID account:kUserNameKey];

    Cookie

    • 是一个网络信息块,用来存储信息
    • cookie 会自动登录,会将 cookie 中保存的数据自动发给服务器
    • 查看 cookie 中信息:注: NSHTTPCookieStorage中保存了cookie 的所有信息

    NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

    • 取出storage 中的cookie 信息

    [storage.cookies enumerateObjectsUsingBlock:^(NSHTTPCookie * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {        

            NSHTTPCookie *cookie = obj;

            NSLog(@"cookie:%@",cookie);

        }];

    }

  • 相关阅读:
    洛谷 1850 NOIP2016提高组 换教室
    2018牛客多校第三场 C.Shuffle Cards
    2018牛客多校第一场 B.Symmetric Matrix
    2018牛客多校第一场 A.Monotonic Matrix
    2018牛客多校第一场 D.Two Graphs
    2018宁夏邀请赛L Continuous Intervals
    2018宁夏邀请赛K Vertex Covers
    BZOJ
    HDU
    ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015)
  • 原文地址:https://www.cnblogs.com/xuan-yuan/p/5452130.html
Copyright © 2011-2022 走看看