关于MD5

这篇博客主要总结了iOS平台下对NSData和NSString进行MD5加密的方法,包括Objective-C和Swift的实现。作者指出,由于某个OC方法被弃用,建议使用其他替代方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

最近把一个在处理关于Md5的一些代码
对了NSData(Data)加密处理,然后进行校验
在这里做一个总结。

开始

头文件必须要引入

#import <CommonCrypto/CommonDigest.h>
import CommonCrypto

1、NSData MD5

1.1、OC

@implementation NSData (MD5)

- (NSString *)MD5 {
    unsigned char result[16];
    CC_MD5(self.bytes, (CC_LONG)self.length, result);   // This is the md5 call
    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]
            ];
}
@end

1.2、Swift

public extension Data {

    func md5() -> String {
        var digestData = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
        digestData.withUnsafeMutableBytes { (digestBytes: UnsafeMutableRawBufferPointer)->Void in
            self.withUnsafeBytes { (messageBytes: UnsafeRawBufferPointer)->Void in
                CC_MD5(messageBytes.baseAddress, CC_LONG(count), digestBytes.bindMemory(to: UInt8.self).baseAddress)
            }
        }
        var digestHex = ""
        for index in 0 ..< Int(CC_MD5_DIGEST_LENGTH) {
            digestHex += String(format: "%02x", digestData[index])
        }
        return digestHex
    }
}

有一个方法是这样的:

extension Data {
  func getMD5String() -> String {
    var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
    _ = withUnsafeBytes { (bytes) in
      CC_MD5(bytes, CC_LONG(count), &digest)
    }
    var digestHex = ""
    for index in 0 ..< Int(CC_MD5_DIGEST_LENGTH) {
      digestHex += String(format: "%02x", digest[index])
    }
    return digestHex
  }
}

BUT
这个地方会有一个警告:
在这里插入图片描述
由于withUnsafeBytes被弃用了,所以还是要换另外的方法去解决
SO,还是建议使用第一个方法

2、NSString MD5

2.1 OC


+ ( NSString *)md5String:( NSString *)str {
    const char *myPasswd = [str UTF8String ];
    unsigned char mdc[ 16 ];
    CC_MD5 (myPasswd, ( CC_LONG ) strlen (myPasswd), mdc);
    NSMutableString *md5String = [ NSMutableString string ];
    for ( int i = 0 ; i< 16 ; i++) {
        [md5String appendFormat : @"%02x" ,mdc[i]];  
    }
    return md5String;
}

OR

@implementation NSString (MD5)

- (NSString *)MD5 {
    const char *cStr = [self UTF8String];
    unsigned char result[16];
    CC_MD5(cStr, (CC_LONG)strlen(cStr), result);   // This is the md5 call
    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]
            ];
}
@end

2.2 Swift

extension String {
    func md5() -> String{
        let str = self.cString(using: String.Encoding.utf8)
        let strLen = CC_LONG(self.lengthOfBytes(using: String.Encoding.utf8))
        let digestLen = Int(CC_MD5_DIGEST_LENGTH)
        let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
        CC_MD5(str!, strLen, result)
        let hash = NSMutableString()
        for i in 0 ..< digestLen {
            hash.appendFormat("%02x", result[i])
        }
        result.deallocate()
        return String(format: hash as String)
    }
}

返回Data

func MD5(string: String) -> Data {
        let length = Int(CC_MD5_DIGEST_LENGTH)
        let messageData = string.data(using:.utf8)!
        var digestData = Data(count: length)
        _ = digestData.withUnsafeMutableBytes { digestBytes -> UInt8 in
            messageData.withUnsafeBytes { messageBytes -> UInt8 in
                if let messageBytesBaseAddress = messageBytes.baseAddress, let digestBytesBlindMemory = digestBytes.bindMemory(to: UInt8.self).baseAddress {
                    let messageLength = CC_LONG(messageData.count)
                    CC_MD5(messageBytesBaseAddress, messageLength, digestBytesBlindMemory)
                }
                return 0
            }
        }
        return digestData
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值