iOS sha256加密

作者: Just_go | 来源:发表于2017-03-10 10:44 被阅读3837次

    后台要对特定字符串进行加密, 在网上找了些代码, 都是错的, 特此总结一下

    哈希值用作表示大量数据的固定大小的唯一值。数据的少量更改会在哈希值中产生不可预知的大量更改。
    sha256 的作用就是防止数据被篡改

    建NSString分类

    #import <Foundation/Foundation.h>
    
    @interface NSString (SHA256)
    
    - (NSString *)SHA256;
    
    @end
    
    #import "NSString+SHA256.h"
    #import <CommonCrypto/CommonDigest.h>
    
    @implementation NSString (SHA256)
    
    - (NSString *)SHA256
    {
        const char *s = [self cStringUsingEncoding:NSASCIIStringEncoding];
        NSData *keyData = [NSData dataWithBytes:s length:strlen(s)];
    
        uint8_t digest[CC_SHA256_DIGEST_LENGTH] = {0};
        CC_SHA256(keyData.bytes, (CC_LONG)keyData.length, digest);
        NSData *out = [NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
        NSString *hash = [out description];
        hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
        hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
        hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
        return hash;
    }
    
    @end
    

    如果是后台对key加密的话

    #import <CommonCrypto/CommonDigest.h>
    #import <CommonCrypto/CommonHMAC.h>
    - (NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key
    {
        const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
        const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding];
        unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
        CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
        NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
        const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
        NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];
        for (int i = 0; i < HMACData.length; ++i){
            [HMAC appendFormat:@"%02x", buffer[i]];
        }
    
        return HMAC;
    }
    

    更新swift3加密代码

    func sha256() -> String{
            if let stringData = self.data(using: .utf8) {
                return hexStringFromData(input: digest(input: stringData as NSData))
            }
            return ""
        }
        
        private func digest(input : NSData) -> NSData {
            let digestLength = Int(CC_SHA256_DIGEST_LENGTH)
            var hash = [UInt8](repeating: 0, count: digestLength)
            CC_SHA256(input.bytes, UInt32(input.length), &hash)
            return NSData(bytes: hash, length: digestLength)
        }
        
        private  func hexStringFromData(input: NSData) -> String {
            var bytes = [UInt8](repeating: 0, count: input.length)
            input.getBytes(&bytes, length: input.length)
            
            var hexString = ""
            for byte in bytes {
                hexString += String(format:"%02x", UInt8(byte))
            }
            
            return hexString
        }
    
    

    在桥接文件中 #import <CommonCrypto/CommonDigest.h>

    附上验证sha加密的网址: http://www.atool.org/hash.php
    参考文章:http://www.jianshu.com/p/2e853f23ac8d
    http://www.jianshu.com/p/98e376b66a26

    相关文章

      网友评论

      • 冰涛:为什么要过滤 空格,< > 号呢?
      • 不辣先生:加密的字符串中有空格会怎样?
      • 米苏芊:中文就为nil
        简了个书1993:编码 NSASCIIStringEncoding 改为 NSUTF8StringEncoding 即可
        Just_go:这个倒是没有考虑到, 一般没有中文吧.

      本文标题:iOS sha256加密

      本文链接:https://www.haomeiwen.com/subject/rosngttx.html