001 --加密的类型:
- 对称加密(传统加密):
DES:数据加密标准(用的少因为强度低)
3DES:使用 3 个密钥,对相同的数据进行三次加密,强度增加了。(由于密钥太保不方便保存,所以用的也很少)
AES:高级加密标准(例如苹果钥匙串访问) - 非对称加密(现代加密):RSA
- HASH加密:MD5、SHA1、SHA256
002--HASH加密
-
定义:Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
Hash的特点.png
用途.png
003--数字签名:是用于鉴别数字信息的方法
- 常用于支付时的金额,首先客户端将金额进行 HASH 加密,再进行 RSA 加密得到加密数据,再将原始金额与加密数据一起发给后端,后端拿到数据后首先 RSA 解密加密数据得到 HASH 值,再将原始金额进行 HASH 加密得到 HASH 值,两值对比,如果一样就表示支付数据未被篡改。
004--HMAC 加密方案:
- 使用一个密钥加密,并且做了两次散列
- 在实际开发中,客户端将用户名发给后端,后端服务器生成密钥key,再返回给客户端(进行 keychain保存),客户端使用HMACMD5进行加密,再将加密后的HMAC哈希值传给服务器,这样就完成注册登录。等于说每个用户都会有一个独立的密钥key,以保证用户密码安全。
- 如果是多设备登录,当用户首次在新设备上登录时,需要向后端请求密钥key,这是后端不会直接给密钥key,而是先向已经认证过的设备请求授权(授权内容:您的账户在另一台 XX设备上登录,您是否给授权),只有授权通过后台会给新设备发送密钥key,客户端使用HMACMD5进行加密,再将加密后的HMAC哈希值传给服务器,这样就完成登录。这个过程就是,设备认证登录。
- 如果黑客拿到用户名和HMAC哈希值(等于黑客拿到登录权限),再发给后端,进行账户登录。
- 针对上面问题,解决方案:(客户端HMAC哈希值(注册时保存的)+客户端时间戳).MD5加密发给后端,后端接收后,将(后端HMAC哈希值+后端时间戳).MD5与接收到的数据进行比较,如果不等,就将后端时间戳提前一分钟,再进行加密比对如果还不成功,就认为登录失败。
- 这样黑客再获取到用户名和HMAC哈希值,就必须两分钟之内进行登录,否则机会登录失效,同时此时HMAC哈希值已不是注册时的HMAC哈希值,所以黑客必须要子啊登录前拿到注册时的HMAC哈希值,否则即使拿到现在的HMAC哈希值也无法登录。
005--对称加密的应用模式
应用模式.png006--CCCrypt函数。苹果的对称加密都是使用该函数
/*!
@function CCCrypt
@abstract Stateless, one-shot encrypt or decrypt operation.
This basically performs a sequence of CCCrytorCreate(),
CCCryptorUpdate(), CCCryptorFinal(), and CCCryptorRelease().
@param alg 定义加密算法 默认:AES、DES还有 3DES 等等
@param op 定义基本操作: kCCEncrypt(加密) or
kCCDecrypt(解密).
@param options 加密选项ECB:密码本 / CBC:链接
@param key 密钥
@param keyLength 密钥长度
@param iv 初始化向量,可选,用于密码块链接(CBC)模式。如果使用使用ECB模式或流,可设置为 NULL。对于声音加密,总是用随机数据初始化IV。
@param dataIn 要加密或解密的数据
@param dataInLength 要加密或解密的数据的长度
@param dataOut 加密或解密后的密文的内存地址。加密和解密可以“就地”执行,输入和输出使用相同的缓冲区。
@param dataOutAvailable 密文的缓冲区的大小
@param dataOutMoved 密文的大小. 如果缓冲区空间不足咋会返回kCCBufferTooSmall。
@result kCCBufferTooSmall表示数据输出中的空间不足缓冲器
kCalignmentError指示dataInLength未正确地对齐的。只能为块返回只有在解密或使用禁用填充的块进行加密。
kCCDecodeError表示密文格式不正确或“错误密钥”错误;仅在解密期间发生操作。
CCCryptorStatus CCCrypt(
CCOperation op, /* kCCEncrypt, etc. */
CCAlgorithm alg, /* kCCAlgorithmAES128, etc. */
CCOptions options, /* kCCOptionPKCS7Padding, etc. */
const void *key,
size_t keyLength,
const void *iv, /* optional initialization vector */
const void *dataIn, /* optional per op and alg */
size_t dataInLength,
void *dataOut, /* data RETURNED here */
size_t dataOutAvailable,
size_t *dataOutMoved)
API_AVAILABLE(macos(10.4), ios(2.0));
网友评论