关于MD5
2019-09-06 17:08:01 weixin_39624536 阅读数 132

写在前面

最近把一个在处理关于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
    }
2017-03-15 15:45:47 fzhlee 阅读数 6578

       在大多数的iOS开发者看来,采用沙箱机制的iOS系统是很安全的,但事实上,iOS系统及里面的应用并没有想象中那么安全。和安卓应用相似,iOS应用也面临着被破解的威胁,存在大量内购破解、源代码破解、植入病毒或广告、二次打包等情况。

       这就需要对应用程序中进进出出的数据进行加密处理,以保护用户的数据和隐私。那么可以通过加密保护哪些数据呢?

  • 对设备中存储的内容进行加密:开发者经常使用UserDefaults、plist文件、CoreData框架等作为数据存储的载体。在存入数据之前对数据进行一些加密操作,可以增强数据的安全性。
  • 对网络传输的数据进行加密:大部分的iOS应用都需要联网,通过和服务器端进行通信,获得最新的信息并且将内容展现给用户。由于网络传输过程中有可能经过不安全的中间节点,所以应该对敏感数据加密,以保证用户信息的安全。
  • 对账户密码进行加盐操作:加盐Salt在密码学中是指,通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这个过程称之为加盐。加盐后的账户密码再经过诸如MD5等方式的加密,然后与服务器端采用同样加盐和加密的密码进行比较,如果两个密码相同,则密码匹配成功。这样无论在客户端还是服务器,当传输的密码被截获后,即使解密成功也无法还原出原始的密码。

对称加密和非对称加密

       加密技术是利用一些技术手段,把重要的数据变为乱码进行数据的传送,当到达目的地后,再用相同或不同的手段进行解密和还原。

       对数据加密的技术分为两类,即对称加密(私人密钥加密)和非对称加密(公开密钥加密)。对称加密以Data Encryption Standard数据加密标准算法即DES为典型代表,非对称加密通常以RivestShamir Adleman即RSA算法为代表。

       对称加密采用对称密码编码技术,它的特点是对数据加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥,这种方法在密码学中叫作对称加密算法,其具有简单快捷、密钥较短、破译困难等特点,如图1所示。

图1

       与对称加密算法不同,非对称加密算法需要两个密钥,一个是公有密钥(Public key),另一个是私有密钥 (Private key)。如果使用公有密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公有密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法,如图2所示:
图2

MD5加密

       MD5的全称是MessageDigest Algorithm 5,即消息摘要算法第五版,是计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。在90年代初由MIT Laboratory for Computer Science 和RSA Data Security Inc的Ronald L.Rivest开发,经MD2、MD3和MD4发展而来。

       MD5可以将任意长度的字节串变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串。

       MD5的典型应用场景是对一段信息生成指纹,以检测信息是否被篡改。例如将一段文字写在一个文本文件中,并对这个文本文件生成一个MD5的值。然后在对该文件进行传播的过程中,如果其它人修改了文件中的任意内容,当对修改后的文件重新计算MD5时,就会发现新旧两个文件的MD5值是不相同。所以我们经常使用MD5对下载的软件进行校验,以检验软件是否被第三方植入病毒代码或广告代码。


1、创建项目并建立桥接文件

       接着我们来创建一个示例项目,对一个字符串进行MD5加密。首先创建一个基于[Single View Applicaton]模板的空白项目,然后在左侧的项目名称文件夹上点击鼠标右键,并选择右键菜单中的[New File...]选项,创建一个桥接头文件,这是因为我们需要使用到Object-C的CommonCrypto.h。

       完成桥接头文件的创建之后,再使用与上一个示例相同的方式,对桥接头文件的路径进行设置,从而完成项目的配置工作,如图3所示:


图3

       然后继续在左侧的项目名称文件夹上点击鼠标右键,并选择右键菜单中的[New File...]选项,从而创建一个.swift文件,我们将在该文件中对String进行扩展:

//
//  StringMD5.swift
//  SecurityProjectMd5
//
//  Created by Jerry on 2017/1/10.
//  Copyright © 2017 www.coolketang.com. All rights reserved.
//

import Foundation

extension Int
{
    func hexedString() -> String
    {
        return NSString(format:"%02x", self) as String
    }
}

extension NSData
{
    func hexedString() -> String
    {
        var string = String()
        let unsafePointer = bytes.assumingMemoryBound(to: UInt8.self)
        for i in UnsafeBufferPointer<UInt8>(start:unsafePointer, count: length)
        {
            string += Int(i).hexedString()
        }
        return string
    }
    func MD5() -> NSData
    {
        let result = NSMutableData(length: Int(CC_MD5_DIGEST_LENGTH))!
        let unsafePointer = result.mutableBytes.assumingMemoryBound(to: UInt8.self)
        CC_MD5(bytes, CC_LONG(length), UnsafeMutablePointer<UInt8>(unsafePointer))
        return NSData(data: result as Data)
    }
}

extension String
{
    func MD5() -> String
    {
        let data = (self as NSString).data(using: String.Encoding.utf8.rawValue)! as NSData
        return data.MD5().hexedString()
    }
}

       从代码中可以看出MD5加密和SHA1加密的步骤基本相似。不同之处是在第16行的代码中,给NSData添加了一个名为MD5的扩展方式,用来实现数据的MD5加密。在加密过程中,首先创建一个CC_MD5_DIGEST_LENGTH长度的可变数据对象。接着通过CC_MD5方法,对数据进行加密,并将加密后的数据存储于可变数据对象。最后将结果转换为NSData格式并返回。

       在第24行的代码中,对String类进行扩展,并添加一个名为MD5的扩展方法。当调用该方法时,首先将字符串转换为NSData对象,并采用UTF-8的编码方式。接着调用NSData的两个扩展方法,完成对字符串的加密操作,并返回十六进制的结果。


2、修改viewDidLoad方法

       和使用SHA1算法进行加密的示例项目相同,最后一步也是修改ViewController类的viewDidLoad方法,在该方法中对字符串coolketang.com进行MD5加密操作,并在日志区输出加密后的结果,以及密文的长度信息:

//
//  ViewController.swift
//  24.1.2SecurityProject_MD5
//
//  Created by Jerry on 2017/1/10.
//  Copyright © 2017 www.coolketang.com. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        let message = "coolketang.com"
        print("Result:"+message.MD5())
        print("Length:\(message.MD5().lengthOfBytes(using: String.Encoding.utf8))")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}


现在已经完成了所有的MD5加密功能的编码工作,点击Xcode界面左上角的[编译并运行]按钮  ,打开模拟器运行项目。项目运行后,将弹出一个空白的模拟器,并在日志区输出加密后的结果,如图4所示:


图4





新 作

iOS开发中的神兵利器

共140节课程,讲解GitHub中近百个过千star的iOS热门开源项目
市面上唯一大规模讲解GitHub中热门的iOS开源项目的教程
快速、优雅地解决iOS开发工作中遇到的各种棘手问题

视频观看地址:http://study.163.com/course/courseMain.htm?courseId=1003657013

互动教程下载地址:https://itunes.apple.com/cn/app/id1209739676





2015-11-18 16:43:17 SebastianMichaelis 阅读数 2132

在Swift中通过调用OC的CommonCrypto库可以很方便的实现String字符串转换为sha1。

在一个swift项目中,需要使用桥接头文件(Bridging header)的方式来引入一个OC库,才能调用OC中的内容。

新建一个Objective-C  m文件

xode自动为我们创建了一个swift和OC桥接的文件:项目名-Bridging-Header.h

在Bridging-Header.h文件中输入:

#import <CommonCrypto/CommonCrypto.h>


在自己的swift类中扩展String方法


extension String {

    
    //sha1加密算法
    func getSha1() -> String {
        let data = self.dataUsingEncoding(NSUTF8StringEncoding)!
        var digest = [UInt8](count:Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)
        CC_SHA1(data.bytes, CC_LONG(data.length), &digest)
        let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH))
        for byte in digest {
            output.appendFormat("%02x", byte)
        }
        return output as String
    }
    
}

extension String {
    //md5加密算法
    func getMd5() -> String {
        let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
        let strLen = CUnsignedInt(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
        let digestLen = Int(CC_MD5_DIGEST_LENGTH)
        let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)
            
        CC_MD5(str!, strLen, result)
            
        let hash = NSMutableString()
        for i in 0..<digestLen {
            hash.appendFormat("%02x", result[i])
        }
            
        result.dealloc(digestLen)
            
        return String(hash)
    }

}

使用:

let s = "zhangsan"

print(s.getSha1())

print(s.getMd5())



2018-02-24 16:54:50 u011146511 阅读数 1487

 =========== swift Base64编码解码==========

    /**

     *   编码

     */

    func base64Encoding(str:String)->String

    {

        

        let strData = str.data(using: String.Encoding.utf8)

        let base64String = strData?.base64EncodedString(options: NSData.Base64EncodingOptions.init(rawValue: 0))

        return base64String!

    }

    

    /**

     *   解码

     */

    func base64Decoding(encodedStr:String)->String

    {

        let decodedData = NSData(base64Encoded: encodedStr, options: NSData.Base64DecodingOptions.init(rawValue: 0))

        let decodedString = NSString(data: decodedData! as Data, encoding: String.Encoding.utf8.rawValue)! as String

        return decodedString

    }


===========MD5=======

//桥接文件中导入

        #import <CommonCrypto/CommonDigest.h>

        MD5算法

        

        extension String{

            func md5() ->String!{

                let str = self.cStringUsingEncoding(NSUTF8StringEncoding)

                let strLen = CUnsignedInt(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))

                let digestLen = Int(CC_MD5_DIGEST_LENGTH)

                let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)

                CC_MD5(str!, strLen, result)

                var hash = NSMutableString()

                for i in 0 ..< digestLen {

                    hash.appendFormat("%02x", result[i])

                }

                result.destroy()

                return String(format: hash as String)

            }

        }

        

        调用MD5算法

        

        var str = "test"

        var str_MD5 = str.md5()


==========sha1=======

建立桥接文件中 #import <CommonCrypto/CommonDigest.h>//md5

        创建string的扩展

        extension String {

            //MARK: - MD5

            func md5() -> String {

                let cStr = self.cString(using: String.Encoding.utf8);

                let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: 16)

                CC_MD5(cStr!,(CC_LONG)(strlen(cStr!)), buffer)

                let md5String = NSMutableString();

                for i in 0 ..< 16{

                    md5String.appendFormat("%02x", buffer[i])

                }

                free(buffer)

                return md5String as String

                

            }

            //MARK: - sha1 加密

            func sha1() -> String {

                

                let data = self.data(using: String.Encoding.utf8)!

                var digest = [UInt8](repeating: 0, count:Int(CC_SHA1_DIGEST_LENGTH))

                

                let newData = NSData.init(data: data)

                CC_SHA1(newData.bytes, CC_LONG(data.count), &digest)

                let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH))

                for byte in digest {

                    output.appendFormat("%02x", byte)

                }

                return output as String

            }

            

            

        }

        

        使用时候,代码如下:

        

        let string = "123456"

        let string_md5 = string.md5()

        

        let string_sha1 = string.sha1()



开源框架 RSA_Swift

阅读数 416

开源框架RSA_Swift

阅读数 15

没有更多推荐了,返回首页