HASH&對稱加密

1、非對稱加密(現(xiàn)代加密算法):RSA(不適合加密大數(shù)據(jù))系忙、ECC
2诵盼、對稱加密(傳統(tǒng)加密算法):DES、3DES银还、AES风宁;應(yīng)用模式:ECB、CBC
3蛹疯、HASH(不是數(shù)據(jù)加密戒财,而是數(shù)據(jù)識別):md5、sha1捺弦、sha256饮寞、sha512

一、HASH

Hash列吼,一般翻譯做“散列”幽崩,也有直接音譯為“哈希”的寞钥,就是把任意長度的輸入通過散列算法變換成固定長度的輸出慌申,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射理郑,也就是蹄溉,散列值的空間通常遠(yuǎn)小于輸入的空間咨油,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值类缤。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)

  • Hash的特點

    • 算法是公開的
    • 對相同數(shù)據(jù)運算,得到的結(jié)果是一樣的
    • 對不同數(shù)據(jù)運算,如MD5得到的結(jié)果默認(rèn)是128位(32個字符(16進(jìn)制標(biāo)識),一個字符4個位)臼勉×诳裕【散列碰撞:128位表示的信息是有限餐弱,所以會存在不同的數(shù)據(jù)得到相同的結(jié)果】
    • 這玩意沒法逆運算
    • 信息摘要,信息“指紋”囱晴,是用來做數(shù)據(jù)識別的膏蚓。
  • md5在線破解
    加鹽


    多次md5

  • HMAC不是一種加密算法,而是一種加密方案畸写。使用一個密鑰加密驮瞧,并且做了兩次散列。在實際開發(fā)中枯芬,密鑰來自于服務(wù)器论笔。每個賬號匹配一個密鑰。

    • 1千所、客戶端填寫一個賬號狂魔,發(fā)給服務(wù)端驗證。服務(wù)端返回一個隨機(jī)數(shù)給客戶端淫痰。
    • 2最楷、此隨機(jī)數(shù)就是HMAC的key〈恚客戶端保存這個key籽孙。客戶端的密碼使用這個key加密火俄,然后把這個加密之后的hash值發(fā)個服務(wù)端犯建。
    • 3、服務(wù)端保存客服端發(fā)送過來的hash值瓜客。這個hash值只會傳輸一次适瓦。在注冊或換手機(jī)登錄的情況下傳輸。
    • 4忆家、以后的每次登錄驗證都是用這個hash值加上服務(wù)端時間戳(精確到分)犹菇,然后再hash一次,得到新的hash發(fā)送給服務(wù)端芽卿。服務(wù)端用它保存的hash值也加上服務(wù)端時間揭芍,然后再hash一次,用得到的hash和客戶端發(fā)送過來的hash比對卸例。比對這一分鐘和上一分鐘称杨,只要有一個比對成功肌毅,就算成功。
    • 5姑原、有一種情況悬而,客戶端換了手機(jī)且開啟了設(shè)備驗證,向服務(wù)端要key锭汛。服務(wù)器會先向授權(quán)設(shè)備發(fā)起是否授權(quán)笨奠,授權(quán)通過發(fā)送key,授權(quán)不通過不發(fā)送key唤殴。
  • Hash用途

    • 用戶密碼的加密
    • 搜索引擎
    • 版權(quán)
    • 數(shù)字簽名

二般婆、密碼加密

通過運用HASH算法,給用戶的密碼進(jìn)行加密

  • 密碼加密方式
    • 直接使用MD5
    • MD5加鹽
    • HMAC加密方案
    • 添點東西

三朵逝、數(shù)字簽名

為什么用簽名這個詞.因為老外喜歡用支票,支票上面的簽名能夠證明這玩意是你的.那么數(shù)字簽名顧名思義,就是用于鑒別數(shù)字信息的方法
數(shù)字簽名

四蔚袍、

  • 密碼:你是這個賬號的主人
  • 人臉、指紋:你是這個手機(jī)的主人

五配名、對稱加密

對稱加密方式:明文通過密鑰加密得到密文啤咽。密文通過密鑰解密得到明文。

  • 常見算法

    • DES 數(shù)據(jù)加密標(biāo)準(zhǔn)(用得少渠脉,因為強度不夠)
    • 3DES 使用3個密鑰宇整,對相同的數(shù)據(jù)執(zhí)行3次加密,強度增強
    • AES 高級密碼標(biāo)準(zhǔn)连舍。
  • 應(yīng)用模式

    • ECB(Electronic Code Book):電子密碼本模式没陡。每一塊數(shù)據(jù),獨立加密索赏。
      最基本的加密模式盼玄,也就是通常理解的加密,相同的明文將永遠(yuǎn)加密成相同的密文潜腻,無初始向量埃儿,容易受到密碼本重放攻擊,一般情況下很少用融涣。

    • CBC(Cipher Block Chaining):密碼分組接模式童番。使用一個密鑰和一個初始化向量[IV]對數(shù)據(jù)執(zhí)行加密。
      明文被加密前要與前面的密文進(jìn)行異或運算后再加密威鹿,因此只要選擇不同的初始向量剃斧,相同的密文加密后會形成不同的密文,這是目前應(yīng)用最廣泛的模式忽你。CBC加密后的密文是上下文相關(guān)的幼东,但明文的錯誤不會傳遞到后續(xù)分組,但如果一個分組丟失,后面的分組將全部作廢(同步錯誤)根蟹。
      CBC可以有效的保證密文的完整性脓杉,如果一個數(shù)據(jù)塊在傳遞是丟失或改變,后面的數(shù)據(jù)將無法正常解密简逮。

六球散、終端操作

  • 終端操作文本

    • 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函數(shù)

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    /** AES - ECB 加密 */
//    NSString * key = @"abc";
//    NSString * encStr = [[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:key iv:nil];
//    NSLog(@"加密的結(jié)果是:%@",encStr);
//
//    NSLog(@"解密的結(jié)果是:%@",[[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;//設(shè)置加密算法泻蚊,默認(rèn)是AES
    NSLog(@"加密的結(jié)果:%@",[[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:key iv:ivData]);
    NSLog(@"解密的結(jié)果:%@",[[EncryptionTools sharedEncryptionTools] decryptString:@"u3W/N816uzFpcg6pZ+kbdg==" keyString:key iv:ivData]);
    
}

下一個符號斷點

    /**
     1躲舌、kCCEncrypt 加密/kCCDecrypt 解密
     2、加密算法性雄。
     3没卸、加密選項:ECB/CBC
     4、加密的密鑰
     5秒旋、密鑰的長度
     6约计、iv 初始化向量
     7、加密的數(shù)據(jù)
     8迁筛、加密的數(shù)據(jù)長度
     9煤蚌、密文的內(nèi)存地址
     10、密文緩沖區(qū)的大小
     11细卧、加密結(jié)果大小
     */
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          self.algorithm,
                                          option,
                                          cKey,
                                          self.keySize,
                                          cIv,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &encryptedSize);

只能用真機(jī)才可以register read出來

八尉桩、代碼

#import <Foundation/Foundation.h>

@interface NSString (Hash)
    
#pragma mark - 散列函數(shù)
    /**
     *  計算MD5散列結(jié)果
     *
     *  終端測試命令:
     *  @code
     *  md5 -s "string"
     *  @endcode
     *
     *  <p>提示:隨著 MD5 碰撞生成器的出現(xiàn),MD5 算法不應(yīng)被用于任何軟件完整性檢查或代碼簽名的用途贪庙。<p>
     *
     *  @return 32個字符的MD5散列字符串
     */
- (NSString *)md5String;
    
    /**
     *  計算SHA1散列結(jié)果
     *
     *  終端測試命令:
     *  @code
     *  echo -n "string" | openssl dgst -sha1
     *  @endcode
     *
     *  @return 40個字符的SHA1散列字符串
     */
- (NSString *)sha1String;
    
    /**
     *  計算SHA256散列結(jié)果
     *
     *  終端測試命令:
     *  @code
     *  echo -n "string" | openssl dgst -sha256
     *  @endcode
     *
     *  @return 64個字符的SHA256散列字符串
     */
- (NSString *)sha256String;
    
    /**
     *  計算SHA 512散列結(jié)果
     *
     *  終端測試命令:
     *  @code
     *  echo -n "string" | openssl dgst -sha512
     *  @endcode
     *
     *  @return 128個字符的SHA 512散列字符串
     */
- (NSString *)sha512String;
    
#pragma mark - HMAC 散列函數(shù)
    /**
     *  計算HMAC MD5散列結(jié)果
     *
     *  終端測試命令:
     *  @code
     *  echo -n "string" | openssl dgst -md5 -hmac "key"
     *  @endcode
     *
     *  @return 32個字符的HMAC MD5散列字符串
     */
- (NSString *)hmacMD5StringWithKey:(NSString *)key;
    
    /**
     *  計算HMAC SHA1散列結(jié)果
     *
     *  終端測試命令:
     *  @code
     *  echo -n "string" | openssl dgst -sha1 -hmac "key"
     *  @endcode
     *
     *  @return 40個字符的HMAC SHA1散列字符串
     */
- (NSString *)hmacSHA1StringWithKey:(NSString *)key;
    
    /**
     *  計算HMAC SHA256散列結(jié)果
     *
     *  終端測試命令:
     *  @code
     *  echo -n "string" | openssl dgst -sha256 -hmac "key"
     *  @endcode
     *
     *  @return 64個字符的HMAC SHA256散列字符串
     */
- (NSString *)hmacSHA256StringWithKey:(NSString *)key;
    
    /**
     *  計算HMAC SHA512散列結(jié)果
     *
     *  終端測試命令:
     *  @code
     *  echo -n "string" | openssl dgst -sha512 -hmac "key"
     *  @endcode
     *
     *  @return 128個字符的HMAC SHA512散列字符串
     */
- (NSString *)hmacSHA512StringWithKey:(NSString *)key;
    
#pragma mark - 文件散列函數(shù)
    
    /**
     *  計算文件的MD5散列結(jié)果
     *
     *  終端測試命令:
     *  @code
     *  md5 file.dat
     *  @endcode
     *
     *  @return 32個字符的MD5散列字符串
     */
- (NSString *)fileMD5Hash;
    
    /**
     *  計算文件的SHA1散列結(jié)果
     *
     *  終端測試命令:
     *  @code
     *  openssl dgst -sha1 file.dat
     *  @endcode
     *
     *  @return 40個字符的SHA1散列字符串
     */
- (NSString *)fileSHA1Hash;
    
    /**
     *  計算文件的SHA256散列結(jié)果
     *
     *  終端測試命令:
     *  @code
     *  openssl dgst -sha256 file.dat
     *  @endcode
     *
     *  @return 64個字符的SHA256散列字符串
     */
- (NSString *)fileSHA256Hash;
    
    /**
     *  計算文件的SHA512散列結(jié)果
     *
     *  終端測試命令:
     *  @code
     *  openssl dgst -sha512 file.dat
     *  @endcode
     *
     *  @return 128個字符的SHA512散列字符串
     */
- (NSString *)fileSHA512Hash;
    
@end
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCrypto.h>

/**
 *  終端測試指令
 *
 *  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     高級加密標(biāo)準(zhǔn)止邮,128位(默認(rèn))
     @constant   kCCAlgorithmDES     數(shù)據(jù)加密標(biāo)準(zhǔn)
     */
    @property (nonatomic, assign) uint32_t algorithm;
    
    /**
     *  加密字符串并返回base64編碼字符串
     *
     *  @param string    要加密的字符串
     *  @param keyString 加密密鑰
     *  @param iv        初始化向量(8個字節(jié))
     *
     *  @return 返回加密后的base64編碼字符串
     */
- (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
    
    /**
     *  解密字符串
     *
     *  @param string    加密并base64編碼后的字符串
     *  @param keyString 解密密鑰
     *  @param iv        初始化向量(8個字節(jié))
     *
     *  @return 返回解密后的字符串
     */
- (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
    
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末这橙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子导披,更是在濱河造成了極大的恐慌屈扎,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撩匕,死亡現(xiàn)場離奇詭異鹰晨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門并村,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巍实,“玉大人,你說我怎么就攤上這事哩牍∨锪剩” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵膝昆,是天一觀的道長丸边。 經(jīng)常有香客問我,道長荚孵,這世上最難降的妖魔是什么妹窖? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮收叶,結(jié)果婚禮上骄呼,老公的妹妹穿的比我還像新娘。我一直安慰自己判没,他們只是感情好蜓萄,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澄峰,像睡著了一般嫉沽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俏竞,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天绸硕,我揣著相機(jī)與錄音,去河邊找鬼魂毁。 笑死玻佩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漱牵。 我是一名探鬼主播夺蛇,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酣胀!你這毒婦竟也來了刁赦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闻镶,失蹤者是張志新(化名)和其女友劉穎甚脉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铆农,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡牺氨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年狡耻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猴凹。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡夷狰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出郊霎,到底是詐尸還是另有隱情沼头,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布书劝,位于F島的核電站进倍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏购对。R本人自食惡果不足惜猾昆,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骡苞。 院中可真熱鬧垂蜗,春花似錦、人聲如沸烙如。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亚铁。三九已至,卻和暖如春螟加,著一層夾襖步出監(jiān)牢的瞬間徘溢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工捆探, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留然爆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓黍图,卻偏偏與公主長得像曾雕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子助被,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355