swift 3.0中使用MD5加密

作者: 这位网友 | 来源:发表于2017-06-15 08:58 被阅读113次
    首先我们需要一个桥接文件
    • 首先创建一个OC文件,任意名字都可以
    • 创建完会询问我们是否需要建立一个 bridging-header文件,我们选择是,此时就生成一个swift-objective-c的桥接文件
    • 移除刚才创建的OC文件(.h和.m)
    • bridging-header文件中导入我们需要的头文件
    // MD5 所需文件
    #import <CommonCrypto/CommonDigest.h>
    
    在你的拓展类中加入拓展方法
    // MARK: MD5
    extension String {
        func md5() -> String {
            let str = self.cString(using: String.Encoding.utf8)
            let strLen = CUnsignedInt(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.deinitialize()
            
            return String(format: hash as String)
        }
    }
    
    外部调用MD5加密算法
    var str = "test"
    let str_MD5 = str.md5()
    
    MD5的理解,网上找的复制过来

    其中%02x是格式控制符:‘x’表示以16进制输出,‘02’表示不足两位,前面补0;如‘f’输出为0f,‘1f3’则输出1f3;本来一般的都会介绍到这里就完了,我想多介绍一下代码中result是个字符数组,那为什么是[16]呢,这是因为MD5算法最后生成的是128位,而在计算机的最小存储单位为字节,1个字节是8位,对应一个char类型,计算可得需要16个char。所以result是[16]。那么为什么输出的格式一定是%02x呢,而不是其它呢。这也是有原因的:因为约定MD5一般是以16进制的格式输出,那么其实这个问题就转换为把128个0和1以16进制来表示,每4位二进制对应一个16进制的元素,则需要32个16进制的元素,如果元素全部为0,放到char的数组中,正常是不会输出,如00001111,以%x输出,则是f,那么就会丢失0;但如果以%02x表示则输出结果是0f,正好是转换的正确结果。

    所以以上就是char[16]和%02x的来历。

    至于人们说的16位MD5加密,其实是这样的:举例如果产生的MD5加密字符串是:01234567abcdefababcdefab76543210,则16位的MD加密字符是abcdefababcdefab,也就是只是截取了中间的16位。实际上这个操作已经不是MD5加密算法所包括的,而应当是对MD5加密算法结果的二次处理。其它的64位和大小写什么的,都属于对MD5算法结果的二次处理。因为MD5算法产生的结果就是128bit,128个二进制数字。

    以上就是我对MD5关于16位和32位的一些简单理解,呵呵。

    OC的可以参考一下http://blog.csdn.net/a787188834/article/details/53244238

    相关文章

      网友评论

        本文标题:swift 3.0中使用MD5加密

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