iOS sha256加密

更新: iOS13的适配在评论中已有人提到, 非常感谢, 请自行移步评论区

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

哈希值用作表示大量数据的固定大小的唯一值。数据的少量更改会在哈希值中产生不可预知的大量更改。
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
参考文章://www.greatytc.com/p/2e853f23ac8d
//www.greatytc.com/p/98e376b66a26

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ------------------.h文件-------------------- #import<Founda...
    彬至睢阳阅读 1,827评论 0 0
  • iOS功能 iOS 如何跳转到系统设置里的指定子功能界面 http://blog.csdn.net/jingfa1...
    EmmaLyx阅读 713评论 0 4
  • 前几天天气特别闷热,心情似乎也跟着燥热着。我感觉轻松愉快的日子已经一去不复返了,大概是从这学期开始的,从决定考研开...
    吴下阿Meng阅读 287评论 1 4
  • 性格:淡淡的……仿佛这世界不存在,只有对霜的时候是一副玩世不恭…… 身份:(1):世界第一黑帮:落血宫大宫主(他和...
    元教主阅读 418评论 0 1
  • 排云驭浪第三狂,二五封王。 狼烟汉武男儿是,趁年少、匹马鹰扬。 踏遍元和藩镇,略同裴相秋娘。 太宗无论叹明皇,草木...
    铨斋阅读 413评论 13 16