HASH&对称加密

1、非对称加密(现代加密算法):RSA(不适合加密大数据)、ECC
2、对称加密(传统加密算法):DES、3DES、AES;应用模式:ECB、CBC
3、HASH(不是数据加密,而是数据识别):md5、sha1、sha256、sha512

一、HASH

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数

  • Hash的特点

    • 算法是公开的
    • 对相同数据运算,得到的结果是一样的
    • 对不同数据运算,如MD5得到的结果默认是128位(32个字符(16进制标识),一个字符4个位)。【散列碰撞:128位表示的信息是有限,所以会存在不同的数据得到相同的结果】
    • 这玩意没法逆运算
    • 信息摘要,信息“指纹”,是用来做数据识别的。
  • md5在线破解
    加盐


    多次md5

  • HMAC不是一种加密算法,而是一种加密方案。使用一个密钥加密,并且做了两次散列。在实际开发中,密钥来自于服务器。每个账号匹配一个密钥。

    • 1、客户端填写一个账号,发给服务端验证。服务端返回一个随机数给客户端。
    • 2、此随机数就是HMAC的key。客户端保存这个key。客户端的密码使用这个key加密,然后把这个加密之后的hash值发个服务端。
    • 3、服务端保存客服端发送过来的hash值。这个hash值只会传输一次。在注册或换手机登录的情况下传输。
    • 4、以后的每次登录验证都是用这个hash值加上服务端时间戳(精确到分),然后再hash一次,得到新的hash发送给服务端。服务端用它保存的hash值也加上服务端时间,然后再hash一次,用得到的hash和客户端发送过来的hash比对。比对这一分钟和上一分钟,只要有一个比对成功,就算成功。
    • 5、有一种情况,客户端换了手机且开启了设备验证,向服务端要key。服务器会先向授权设备发起是否授权,授权通过发送key,授权不通过不发送key。
  • Hash用途

    • 用户密码的加密
    • 搜索引擎
    • 版权
    • 数字签名

二、密码加密

通过运用HASH算法,给用户的密码进行加密

  • 密码加密方式
    • 直接使用MD5
    • MD5加盐
    • HMAC加密方案
    • 添点东西

三、数字签名

为什么用签名这个词.因为老外喜欢用支票,支票上面的签名能够证明这玩意是你的.那么数字签名顾名思义,就是用于鉴别数字信息的方法
数字签名

四、

  • 密码:你是这个账号的主人
  • 人脸、指纹:你是这个手机的主人

五、对称加密

对称加密方式:明文通过密钥加密得到密文。密文通过密钥解密得到明文。

  • 常见算法

    • DES 数据加密标准(用得少,因为强度不够)
    • 3DES 使用3个密钥,对相同的数据执行3次加密,强度增强
    • AES 高级密码标准。
  • 应用模式

    • ECB(Electronic Code Book):电子密码本模式。每一块数据,独立加密。
      最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。

    • CBC(Cipher Block Chaining):密码分组接模式。使用一个密钥和一个初始化向量[IV]对数据执行加密。
      明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。
      CBC可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密。

六、终端操作

  • 终端操作文本

    • 1、vim message.txt 或者 vi message.txt
    • 2、i
    • 3、esc
    • 4、:
    • 5、wq
  • DES-ECB: openssl enc -des-ecb -K 616263 -nosalt -in message.txt -out msg1.bin

  • DES-CBC: openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -in message.txt -out msg3.bin

七、CCCrypt函数

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    /** AES - ECB 加密 */
//    NSString * key = @"abc";
//    NSString * encStr = [[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:key iv:nil];
//    NSLog(@"加密的结果是:%@",encStr);
//
//    NSLog(@"解密的结果是:%@",[[EncryptionTools sharedEncryptionTools] decryptString:encStr keyString:key iv:nil]);
    
    
    /** AES - CBC 加密 */
    NSString * key = @"abc";
    uint8_t iv[8] = {1,2,3,4,5,6,7,8};
    NSData * ivData = [NSData dataWithBytes:iv length:sizeof(iv)];
    
    /** 对称加密算法
     kCCAlgorithmAES128 = 0,
     kCCAlgorithmAES = 0,
     kCCAlgorithmDES,
     kCCAlgorithm3DES,
     kCCAlgorithmCAST,
     kCCAlgorithmRC4,
     kCCAlgorithmRC2,
     kCCAlgorithmBlowfish
     */
//    [EncryptionTools sharedEncryptionTools].algorithm = kCCAlgorithm3DES;//设置加密算法,默认是AES
    NSLog(@"加密的结果:%@",[[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:key iv:ivData]);
    NSLog(@"解密的结果:%@",[[EncryptionTools sharedEncryptionTools] decryptString:@"u3W/N816uzFpcg6pZ+kbdg==" keyString:key iv:ivData]);
    
}

下一个符号断点

    /**
     1、kCCEncrypt 加密/kCCDecrypt 解密
     2、加密算法。
     3、加密选项:ECB/CBC
     4、加密的密钥
     5、密钥的长度
     6、iv 初始化向量
     7、加密的数据
     8、加密的数据长度
     9、密文的内存地址
     10、密文缓冲区的大小
     11、加密结果大小
     */
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          self.algorithm,
                                          option,
                                          cKey,
                                          self.keySize,
                                          cIv,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &encryptedSize);

只能用真机才可以register read出来

八、代码

#import 

@interface NSString (Hash)
    
#pragma mark - 散列函数
    /**
     *  计算MD5散列结果
     *
     *  终端测试命令:
     *  @code
     *  md5 -s "string"
     *  @endcode
     *
     *  

提示:随着 MD5 碰撞生成器的出现,MD5 算法不应被用于任何软件完整性检查或代码签名的用途。

* * @return 32个字符的MD5散列字符串 */ - (NSString *)md5String; /** * 计算SHA1散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl dgst -sha1 * @endcode * * @return 40个字符的SHA1散列字符串 */ - (NSString *)sha1String; /** * 计算SHA256散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl dgst -sha256 * @endcode * * @return 64个字符的SHA256散列字符串 */ - (NSString *)sha256String; /** * 计算SHA 512散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl dgst -sha512 * @endcode * * @return 128个字符的SHA 512散列字符串 */ - (NSString *)sha512String; #pragma mark - HMAC 散列函数 /** * 计算HMAC MD5散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl dgst -md5 -hmac "key" * @endcode * * @return 32个字符的HMAC MD5散列字符串 */ - (NSString *)hmacMD5StringWithKey:(NSString *)key; /** * 计算HMAC SHA1散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl dgst -sha1 -hmac "key" * @endcode * * @return 40个字符的HMAC SHA1散列字符串 */ - (NSString *)hmacSHA1StringWithKey:(NSString *)key; /** * 计算HMAC SHA256散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl dgst -sha256 -hmac "key" * @endcode * * @return 64个字符的HMAC SHA256散列字符串 */ - (NSString *)hmacSHA256StringWithKey:(NSString *)key; /** * 计算HMAC SHA512散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl dgst -sha512 -hmac "key" * @endcode * * @return 128个字符的HMAC SHA512散列字符串 */ - (NSString *)hmacSHA512StringWithKey:(NSString *)key; #pragma mark - 文件散列函数 /** * 计算文件的MD5散列结果 * * 终端测试命令: * @code * md5 file.dat * @endcode * * @return 32个字符的MD5散列字符串 */ - (NSString *)fileMD5Hash; /** * 计算文件的SHA1散列结果 * * 终端测试命令: * @code * openssl dgst -sha1 file.dat * @endcode * * @return 40个字符的SHA1散列字符串 */ - (NSString *)fileSHA1Hash; /** * 计算文件的SHA256散列结果 * * 终端测试命令: * @code * openssl dgst -sha256 file.dat * @endcode * * @return 64个字符的SHA256散列字符串 */ - (NSString *)fileSHA256Hash; /** * 计算文件的SHA512散列结果 * * 终端测试命令: * @code * openssl dgst -sha512 file.dat * @endcode * * @return 128个字符的SHA512散列字符串 */ - (NSString *)fileSHA512Hash; @end

#import 
#import 

/**
 *  终端测试指令
 *
 *  DES(ECB)加密
 *  $ echo -n hello | openssl enc -des-ecb -K 616263 -nosalt | base64
 *
 * DES(CBC)加密
 *  $ echo -n hello | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
 *
 *  AES(ECB)加密
 *  $ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
 *
 *  AES(CBC)加密
 *  $ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
 *
 *  DES(ECB)解密
 *  $ echo -n HQr0Oij2kbo= | base64 -D | openssl enc -des-ecb -K 616263 -nosalt -d
 *
 *  DES(CBC)解密
 *  $ echo -n alvrvb3Gz88= | base64 -D | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -d
 *
 *  AES(ECB)解密
 *  $ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
 *
 *  AES(CBC)解密
 *  $ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt -d
 *
 *  提示:
 *      1> 加密过程是先加密,再base64编码
 *      2> 解密过程是先base64解码,再解密
 */
@interface EncryptionTools : NSObject
    
+ (instancetype)sharedEncryptionTools;
    
    /**
     @constant   kCCAlgorithmAES     高级加密标准,128位(默认)
     @constant   kCCAlgorithmDES     数据加密标准
     */
    @property (nonatomic, assign) uint32_t algorithm;
    
    /**
     *  加密字符串并返回base64编码字符串
     *
     *  @param string    要加密的字符串
     *  @param keyString 加密密钥
     *  @param iv        初始化向量(8个字节)
     *
     *  @return 返回加密后的base64编码字符串
     */
- (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
    
    /**
     *  解密字符串
     *
     *  @param string    加密并base64编码后的字符串
     *  @param keyString 解密密钥
     *  @param iv        初始化向量(8个字节)
     *
     *  @return 返回解密后的字符串
     */
- (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
    
@end

你可能感兴趣的:(HASH&对称加密)