使用Swift 3.0实现原生的MD5加密
来源:互联网 发布:开发者头条 知乎 编辑:程序博客网 时间:2024/06/16 22:13
在大多数的iOS开发者看来,采用沙箱机制的iOS系统是很安全的,但事实上,iOS系统及里面的应用并没有想象中那么安全。和安卓应用相似,iOS应用也面临着被破解的威胁,存在大量内购破解、源代码破解、植入病毒或广告、二次打包等情况。
这就需要对应用程序中进进出出的数据进行加密处理,以保护用户的数据和隐私。那么可以通过加密保护哪些数据呢?
- 对设备中存储的内容进行加密:开发者经常使用UserDefaults、plist文件、CoreData框架等作为数据存储的载体。在存入数据之前对数据进行一些加密操作,可以增强数据的安全性。
- 对网络传输的数据进行加密:大部分的iOS应用都需要联网,通过和服务器端进行通信,获得最新的信息并且将内容展现给用户。由于网络传输过程中有可能经过不安全的中间节点,所以应该对敏感数据加密,以保证用户信息的安全。
- 对账户密码进行加盐操作:加盐Salt在密码学中是指,通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这个过程称之为加盐。加盐后的账户密码再经过诸如MD5等方式的加密,然后与服务器端采用同样加盐和加密的密码进行比较,如果两个密码相同,则密码匹配成功。这样无论在客户端还是服务器,当传输的密码被截获后,即使解密成功也无法还原出原始的密码。
对称加密和非对称加密
加密技术是利用一些技术手段,把重要的数据变为乱码进行数据的传送,当到达目的地后,再用相同或不同的手段进行解密和还原。
对数据加密的技术分为两类,即对称加密(私人密钥加密)和非对称加密(公开密钥加密)。对称加密以Data Encryption Standard数据加密标准算法即DES为典型代表,非对称加密通常以RivestShamir Adleman即RSA算法为代表。
对称加密采用对称密码编码技术,它的特点是对数据加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥,这种方法在密码学中叫作对称加密算法,其具有简单快捷、密钥较短、破译困难等特点,如图1所示。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所示:
//// StringMD5.swift// SecurityProjectMd5//// Created by Jerry on 2017/1/10.// Copyright © 2017 www.coolketang.com. All rights reserved.//import Foundationextension 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 UIKitclass 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
- 使用Swift 3.0实现原生的MD5加密
- 使用Swift 3.0实现原生的3DES加密和解密
- MD5加密的实现
- MD5加密的实现
- MD5加密的实现
- MD5加密的使用
- 使用openssl实现md5加密
- 使用MD5实现简单加密
- Swift版MD5加密
- swift-MD5加密
- Swift MD5加密
- swift MD5 加密
- iOS swift MD5加密
- 使用MD5对密码进行加密的功能的实现
- 如何使用MD5加密,MD5的特点
- MD5加密的javascript实现
- MD5加密的javascript实现
- MD5加密的javascript实现
- 使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
- hihocoder
- Linux命令之Sed详解
- 题目1061:成绩排序
- 线程和进程
- 使用Swift 3.0实现原生的MD5加密
- 【Dash】Dash相关领域知识总结
- ubuntu12.04解决gedit中文显示乱码问题(转载)
- mysql 批量更新与批量更新多条记录的不同值实现方法
- webstore打不开
- iOS开发中关于没有数据时不显示tableView的分割线
- 机器学习算法二
- 借助易语言InternetExplorer事件和ShellWindows事件1 实现置外部IE广告(假BHO)
- Java程序在内网的linux系统上启动报错(配置DNS后)