1. 程式人生 > >專案裡面常用的加密方式base64、AES、MD5、sha-1

專案裡面常用的加密方式base64、AES、MD5、sha-1

今天重新整理了一遍以前專案中經常用到過的幾種加密的方式,發現以前其實對這幾種加密的方式理解的不是特別的深刻首先從加密的本質是來看,是把一些不定長度的資料按照一定的編碼規則輸出為一種一定長度的資料串。這個是我理解的加密,其中不同的加密手段採用不同的編碼規則。閱讀之前先了解一些基本的概念:


1.簡單的概念


明文:加密前的資訊


密文:機密後的資訊


演算法:加密或解密的演算法


金鑰:演算法使用的鑰匙(讀作miyao,正確應該是miyue,但是大家都讀miyao)


2.簡單的例子


將123456每位數字都加1後得到234567,


其中123456就是明文,234567就是密文,加密金鑰就是1,加密演算法是每位加




3.對稱加密和非對稱加密


以上為例,


123456-->234567的加密金鑰就是1,加密演算法是每位+


234567-->123456的解密金鑰也是1,解密演算法是每位-


其中加密演算法(+)和解密演算法(-)相對稱,這種加密演算法就稱作對稱加密,


同樣,如果加密演算法和解密演算法不對稱就稱之為非對稱加密。




4.演算法舉例


對稱加密演算法:DES演算法,3DES演算法,TDEA演算法,Blowfish演算法,RC5演算法,IDEA演算法,AES演算法。


非對稱加密演算法:RSA、Elgamal、揹包演算法、Rabin、D-H、ECC。


經典的雜湊演算法:MD2、MD4、MD5 和 SHA-1(目的是將任意長輸入通過演算法變為固定長輸出,且保證輸入變化一點輸出都不同,且不能反向解密)




下面我們說一下我們常用到的加密手段


1.base64,這個加密手段是一些專案裡面常用到的,一般採用這種加密手段十分好破解,他的加密實際作用不在於保密,你看看經過BASE64編碼後的字串,全部都是由標準鍵盤上面的常規字元組成,這樣編碼後的字串在閘道器之間傳遞不會產生UNICODE字串不能識別或者丟失的現象。你再仔細研究下EMAIL就會發現其實EMAIL就是用base64編碼過後再發送的。然後接收的時候再還原。
    還有一種情況下用BASE64編碼也很好,比如一個圖片檔案,或者其他任何二進位制檔案。我可以把它編碼成字串。這樣用XML或者資料庫就能直接以文字的方式來儲存這些檔案了。
       下面就說一下他的具體使用了:
首先你要先新增幾個檔案GTMBase64,這個是第三方的庫可以從網路資源中獲取,直接呼叫裡面的演算法


//加密演算法
+(NSData *)encodeData:(NSData *)data {
    return [self baseEncode:[data bytes]
                     length:[data length]
                    charset:kBase64EncodeChars
                     padded:YES];
}
//解密演算法
+(NSData *)decodeData:(NSData *)data {
    return [self baseDecode:[data bytes]
                     length:[data length]
                    charset:kBase64DecodeChars
             requirePadding:YES];
}
從程式中我們可以看到無論是加密還是解密他處理的物件都是nsdata型別的
所以我們在加密解密之前要對資料進行二進位制編碼
例項說明:
//使用者名稱
                  NSData*data_user=[userName_TF.text dataUsingEncoding:NSUTF8StringEncoding];
                  NSData*Data_U=[GTMBase64 encodeData:data_user];
                  NSString*username=[[NSString alloc]initWithData:Data_U encoding:NSUTF8StringEncoding];


2.下面說一下MD5加密的作用和用法


首先要知道MD5加密原理和性質,MD5首先他是一個安全的算列演算法,他有兩個特點。其一,輸入兩段明文也就是原始資料,不會得到相同的輸出值。
其二,他的過程是不可逆的也就是說根據輸出值,是不能得到原始的明文的。所以要解密MD5沒有現成的演算法,只能用窮舉法,把可能出現的明文,用MD5演算法雜湊之後,把得到的雜湊值和原始的資料形成一個一對一的對映表,然後在所謂的解密的時候,都是通過這個對映表來查詢其所對應的原始明文。
而絕對沒有一種演算法,可以通過輸出加密後的散搜尋列值算出原始明文。
使用演算法:
- (NSString *)md5Encrypt {


    
    const char *cStr = [self UTF8String];
    unsigned char result[16];
    CC_MD5( cStr, strlen(cStr), result );
    return [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
            result[0], result[1], result[2], result[3],
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ];
}


直接拓展NSString演算法,直接呼叫這個演算法就可以了用起來十分簡單。
[nsstring   md5Encrypt]—>返回值也是一個字串。MD5加密可以生成一個16位的字串或者是32位的字串


3.SHA-1與MD5都是摘要演算法,且為不可逆演算法;


應用角度來講,適用性比安全性重要,兩個演算法長度有所不同,SHA-1 160位,MD5 128位。
如果從安全形度,在計算出摘要後,對摘要進行簽名,可以增加抗抵賴、防篡改的能力


//32位MD5加密方式
+ (NSString *)getMd5_32Bit_String:(NSString *)srcString isUppercase:(BOOL)isUppercase{
    const char *cStr = [srcString UTF8String];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, strlen(cStr), digest );
    NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
        [result appendFormat:@"%02x", digest[i]];
    
    if (isUppercase) {
        return   [result uppercaseString];
    }else{
        return result;
    }
    
}
//16位MD5加密方式
+ (NSString *)getMd5_16Bit_String:(NSString *)srcString isUppercase:(BOOL)isUppercase{
    //提取32位MD5雜湊的中間16位
    NSString *md5_32Bit_String=[self getMd5_32Bit_String:srcString isUppercase:NO];
    NSString *result = [[md5_32Bit_String substringToIndex:24] substringFromIndex:8];//即9~25位
    
    if (isUppercase) {
        return   [result uppercaseString];
    }else{
        return result;
    }
    
}
//sha1加密方式
+ (NSString *)getSha1String:(NSString *)srcString{
    const char *cstr = [srcString cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:srcString.length];
    
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    
    CC_SHA1(data.bytes, data.length, digest);
    
    NSMutableString* result = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
        [result appendFormat:@"%02x", digest[i]];
    }
    
    return result;
}
//sha256加密方式
+ (NSString *)getSha256String:(NSString *)srcString {
    const char *cstr = [srcString cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:srcString.length];
    
    uint8_t digest[CC_SHA256_DIGEST_LENGTH];
    
    CC_SHA1(data.bytes, data.length, digest);
    
    NSMutableString* result = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
        [result appendFormat:@"%02x", digest[i]];
    }
    
    return result;
}
//sha384加密方式
+ (NSString *)getSha384String:(NSString *)srcString {
    const char *cstr = [srcString cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:srcString.length];
    
    uint8_t digest[CC_SHA384_DIGEST_LENGTH];
    
    CC_SHA1(data.bytes, data.length, digest);
    
    NSMutableString* result = [NSMutableString stringWithCapacity:CC_SHA384_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_SHA384_DIGEST_LENGTH; i++) {
        [result appendFormat:@"%02x", digest[i]];
    }
    
    return result;
}


//sha512加密方式
+ (NSString*) getSha512String:(NSString*)srcString {
    const char *cstr = [srcString cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:srcString.length];
    uint8_t digest[CC_SHA512_DIGEST_LENGTH];
    
    CC_SHA512(data.bytes, data.length, digest);
    
    NSMutableString* result = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2];
    for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++)
        [result appendFormat:@"%02x", digest[i]];
    return result;
}
這是具體的演算法,直接封裝在一個類裡面直接呼叫就可以了使用方法和MD5是一樣的。




4.AES加密演算法。


AES是DES的進化版
這個是我目前使用的具有保密性的一個加密演算法這個加密的時候需要一個key值解密的時候也要需要同樣的key值才可以解密,相當於一個口令。
加密演算法使用


//金鑰加密和解密的時候要用
#define kCryptingKey @"1102130405061708"  /// 同上


#define kCryptingIv @"1102130405061708"   /// 同上


@implementation Tool


+ (NSString*) encrypt:(NSString*)recource
{
    NSData *data = [recource dataUsingEncoding:NSUTF8StringEncoding];
    NSData *result = [self AES128EncryptWithKey:kCryptingKey withData:data iv:kCryptingIv];
    return [self stringWithHexBytes:result];
}


+ (NSString*) decryptData:(NSData*)recource
{
    NSData *decrypt = [self AES128DecryptWithKey:kCryptingKey withData:recource iv:kCryptingIv];
    return [[NSString alloc] initWithData:decrypt encoding:NSUTF8StringEncoding];
}


+ (NSString*) decrypt:(NSString*)recource
{
    NSData* data=[self decodeFromHexidecimal:recource];
    NSData *decrypt = [self AES128DecryptWithKey:kCryptingKey withData:data iv:kCryptingIv];
    return [[NSString alloc] initWithData:decrypt encoding:NSUTF8StringEncoding];
}


+ (NSData *) decodeFromHexidecimal:(NSString*)str
{
    NSString *command = [NSString stringWithString:str];
    command = [command stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSMutableData *commandToSend = [[NSMutableData data] init];
    unsigned char whole_byte;
    char byte_chars[3] = {'\0','\0','\0'};
    int i;
    for (i=0; i < [command length]/2; i++) {
        byte_chars[0] = [command characterAtIndex:i*2];
        byte_chars[1] = [command characterAtIndex:i*2+1];
        whole_byte = strtol(byte_chars, NULL, 16);
        [commandToSend appendBytes:&whole_byte length:1];
    }
    return commandToSend;
}


+ (NSData *)AES128EncryptWithKey:(NSString *)key withData:(NSData*)_data iv:(NSString *) iv
{
    char keyPtr[kCCKeySizeAES128 + 1];
    memset(keyPtr, 0, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding];
    
    char ivPtr[kCCBlockSizeAES128 + 1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [_data length];
    
    int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
    unsigned long int newSize = 0;
    
    if(diff > 0)
    {
        newSize = dataLength + diff;
    }
    
    char dataPtr[newSize];
    memcpy(dataPtr, [_data bytes], [_data length]);
    for(int i = 0; i < diff; i++)
    {
        dataPtr[i + dataLength] = 0x00;
    }
    
    size_t bufferSize = newSize + kCCBlockSizeAES128;
    
    void *buffer = malloc( bufferSize );
    memset(buffer, 0, bufferSize);
    
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, 0x0000,
                                          keyPtr, kCCKeySizeAES128,
                                          ivPtr,
                                          dataPtr,
                                          sizeof(dataPtr),
                                          buffer, bufferSize, /* output */
                                          &numBytesEncrypted );
    if( cryptStatus == kCCSuccess )
    {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    
    free( buffer ); //free the buffer
    return nil;
}


+ (NSData *)AES128DecryptWithKey:(NSString *)key withData:(NSData*)data iv:(NSString *) iv
{
    char keyPtr[kCCKeySizeAES128 + 1];
    memset(keyPtr, 0, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    char ivPtr[kCCBlockSizeAES128 + 1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [data length];
    
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,  0x0000,
                                          keyPtr, kCCBlockSizeAES128,
                                          ivPtr,
                                          [data bytes],
                                          dataLength,
                                          buffer, bufferSize, /* output */
                                          &numBytesDecrypted);
    if (cryptStatus == kCCSuccess) {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }
    
    free(buffer); //free the buffer;
    return nil;
}


+ (NSString*) stringWithHexBytes:(NSData*)_data {
    NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:([_data length] * 2)];
    const unsigned char *dataBuffer = [_data bytes];
    int i;
    for (i = 0; i < [_data length]; ++i) {
        [stringBuffer appendFormat:@"%02lX", (unsigned long)dataBuffer[i]];
    }
    return [stringBuffer copy];
}


也是直接封裝在一個類裡面直接呼叫演算法就可以了,一般來說加密的時候專案你的開發文件上會告訴你這裡的金鑰你只要把相應的部分替換就可以了。
5.RSA待更新

相關推薦

專案裡面常用加密方式base64AESMD5sha-1

今天重新整理了一遍以前專案中經常用到過的幾種加密的方式,發現以前其實對這幾種加密的方式理解的不是特別的深刻首先從加密的本質是來看,是把一些不定長度的資料按照一定的編碼規則輸出為一種一定長度的資料串。這個是我理解的加密,其中不同的加密手段採用不同的編碼規則。閱讀之前先了解一些

加密算法(DES,AES,RSA,MD5,SHA1,Base64)比較和項目應用(轉載)

and tcp 認證 sha1 http 用兩個 col token 初級 加密技術通常分為兩大類:"對稱式"和"非對稱式"。 對稱性加密算法:對稱式加密就是加密和解密使用同一個密鑰。信息接收雙方都需事先知道密匙和加解密算法且其密匙是相同的,之後便是對數據進行加解密了。對

java 實現各種加密MD5SHA-1,SHA-256)

常用加密演算法通用方法: package BinTest.bin; import java.security.MessageDigest; import java.security.NoSuchAl

加密演算法總結 加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用

加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用 加密技術通常分為兩大類:"對稱式"和"非對稱式"。 對稱性加密演算法:對稱式加密就是加密和解密使用同一個金鑰。資訊接收雙方都需事先知道密匙和加解密演算法且其密匙是相同的,之後便是對資料進行加解密了。對稱加密演算法用

加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用, 各種加密演算法比較

加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用 - sochishun - 部落格園 https://www.cnblogs.com/sochishun/p/7028056.html     加密演算法(DES,AES,RSA,MD

App安全登入之密碼通訊加密方法(MD5,Base64,RSA,AES

今天研究了一下關於登入密碼加密的問題,下面來說說實現。 一、RSA非對稱加密: 具體流程如下:擷取自http://blog.csdn.net/m372897500/article/details/50905017 客戶端向伺服器第一次發起登入請求(不傳輸使用者名稱和密碼)。

golang常用加密解密演算法總結(AESDESRSASha1MD5)

在專案開發過程中,當操作一些使用者的隱私資訊,諸如密碼、帳戶金鑰等資料時,往往需要加密後可以在網上傳輸。這時,需要一些高效地、簡單易用的加密演算法加密資料,然後把加密後的資料存入資料庫或進行其他操作;當需要讀取資料時,把加密後的資料取出來,再通過演算法解密。 關於加密解密 當前我們專案中常用

Python實現DESDES3AESRSAMD5SHAHMAC加密方式及示例

對上述七中加密方式的整理,始於前端js對密碼加密實現的需要,目前使用最多是AES、RSA、MD5,當然這三個的巢狀和混合使用情況也比較多。 這應該是Python3目前最全的整理,所有案列都親自測試可行,並標註了使用的一些注意事項和說明。 目前總結有下面幾點: 對稱加密(加密解密金

linux之用openssl命令Base64編碼解碼md5/sha1摘要AES/DES3加密解密

1、我們先看openssl help命令會輸出什麼? 2、我們用openssl命令實現字串和文字的Base64編碼和解碼 openssl base64 openssl base64 -

vue專案用sha256md5base64加密密碼

無論你開發什麼樣的專案,你可能都會要開發登入、註冊、修改密碼、忘記密碼這些功能,少數專案除外!!要實現這些功能,對於保護使用者或者管理員賬號密碼,這是我們程式設計師肯定要做的事情。要是使用者密碼不加密,用明文方式傳給後臺,是不是有點耍流氓了!!!所以為了保證密碼的不可見性,我

加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用

1.加密演算法分類 加密技術通常分為兩大類:”對稱式”和”非對稱式”。 1.1對稱性加密演算法: 對稱式加密就是加密和解密使用同一個金鑰。資訊接收雙方都需事先知道密匙和加解密演算法且其密匙是相同的,之後便是對資料進行加解密了。對稱加密演算法用來對敏感資

js的常見的三種密碼加密方式-MD5加密Base64加密和解密和sha1加密詳解總結

寫在前面寫前端的時候,很多的時候是避免不了註冊這一關的,但是一般的註冊是沒有任何的難度的,無非就是一些簡單的獲取使用者輸入的資料,然後進行簡單的校驗以後呼叫介面,將資料傳送到後端,完成一個簡單的註冊的流程,那麼一般來說,密碼是不做加密的。但是也有一些資料庫裡面存放的是加密後的

java 加密工具類(MD5RSAAES加密方式

 MD5加密 import org.apache.commons.codec.digest.DigestUtils; /** * MD5加密元件 * * @version 1.0 * @since 1.0 */ public abstract class M

AES加密解密&amp;&amp;SHA1SHA加密&amp;&amp;MD5加密

algorithm buffer password 使用 eas ray locks tex update AES加密解密 SHA1、SHA加密 MD5加密 二話不說立即附上代碼: package com.luo.util; import j

加密算法:DESAES

-1 加密 www www. 數字 cnblogs 安全 font 性能 指標:運算速度、安全性、資源消耗 對稱加密算法(加解密密鑰相同): 非對稱算法(加密密鑰和解密密鑰不同): 散列算法比較: 對稱與非對稱算法比較: 算法選擇(從性能和安全性綜合) 對稱加密

guacamole 的前臺base64加密方式

tty default i++ ng- for utf host efault return var s = "otherhostcdefault"; var uint8array = new TextEncoder("utf-8").encode(s); v

【Python】學習筆記4-timemd5加密base64模塊

數據庫 sta 自己的 pri 時間 decode 不可 字符 ftime 1、time # 1、格式化好的時間 2018-1-14 16:42# 2、時間戳 是從unix元年到現在所有的秒數# 3、時間元組# 想時間戳和格式化好的時間互相轉換的話,都要先轉成時間元組,然後

eclipse基本設置----中文亂碼行數顯示縮進方式行末空格和空行自動刪除常用註解

空行 name info prop 刪除行 ber 導入 影響 Edito 一、中文亂碼   window系統下,Eclipse中導入新的項目的時候,可能會遇到中文亂碼的問題。   解決方案:將系統默認的格式為GBK改成UTF-8。以下是具體解決方法,可以根據需要選擇不同的

Android 常用的數據加密方式

變化 ati 本地 enc factor 由於 provide ... pair 前言 Android 很多場合需要使用到數據加密,比如:本地登錄密碼加密,網絡傳輸數據加密,等。在android 中一般的加密方式有如下: 亦或加密 AES加密 RSA非對稱加密 當然還有

php aes加密解密類(兼容php5php7)

bytes pri rip dom ase lee vat idea cipher <?php /** * @desc:php aes加密解密類 * @author [Lee] <[<[email protected]>]> */ class