4 md5 swift

2017-07-16 13:44:31 robinson_911 阅读数 1553

因为MD5加密是不可逆的,所以一般只有MD5加密的算法,而没有MD5解密的算法。

创建一个Sting+MD5.Swift字符串分类文件(同时此处需要创建一个bridge.h桥接文件,引入这个头文件

#import <CommonCrypto/CommonDigest.h>,md5加密方法需要使用的文件

1.bridge.h桥接文件如下:

#ifndef bridge_h  
#define bridge_h  
  
#import <CommonCrypto/CommonDigest.h>  
  
#endif /* bridge_h */ 

2. Sting+MD5.swift字符串分类文件如下

MD5加密算法如下

import Foundation  
  
extension String {  
    var 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.deinitialize()  
          
        return String(format: hash as String)  
    }  
}  



2018-05-07 12:08:20 yaojinhai06 阅读数 4116

之前写过一个 swift md5 加密的的文章很短,很短,但是很实用,有的朋友说有问题不能运行,这里我先声明我的xcode9.3的 这个版本截止到目前是最新的,我这个是没问题的.那么我总是感觉那个方法还有点oc的味道,所以今天就改成完全是swift 版本.

直接上代码:

var MD5String: String {

        let cStrl = cString(using: String.Encoding.utf8.rawValue);

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

        CC_MD5(cStrl, CC_LONG(strlen(cStrl!)), buffer);

        var md5String = "";

        for idx in 0...15 {

            let obcStrl = String.init(format: "%02x", buffer[idx]);

            md5String.append(obcStrl);

        }

        free(buffer);

        return md5String;

    }

可以给String 添加一个扩展,这样MD5就是Ta的一个属性了,效率高很多.

另外要说的是 其他的操作不能少,如果还有问题,欢迎拍砖....





2018-08-30 17:20:37 PRESISTSI 阅读数 4125

Swift4.2已近发布一段时间了,新版本的稳定性以及对上个版本的兼容性都有了显著的提升(再也不用吐槽:每个Swift版本都像是一门新的语言啦,hahaha…)。现在大多IOS开发者对Swift持观望态度,原因无非是这门语言太年轻,不稳定之类的,再加之ABI稳定版本(据说是Swift5)不知何时能来,大家普遍生出了再等等的心态。然而,总结这几日的使用情况,Swift4.2的简洁和强大的表现力深深的折服了我,走过了四年的风风雨雨, Swift日趋成熟,所以,现在上车,恰逢其时…

言归正传,下面记录下今天遇到的问题吧:

是的,很简单的一个问题,Swift里的MD5加密。搜了些网上的,发现都有些陈旧,各种报错,有的甚至还要桥接OC。综合大家的写法,找到一段能稳定跑起来的代码,暂时用起来没有问题。下面贴出来,希望能帮到大家,欢迎指正:

import Foundation
// 导入CommonCrypto
import CommonCrypto

// 直接给String扩展方法
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<UInt8>.allocate(capacity: 16)
        CC_MD5(str!, strLen, result)
        let hash = NSMutableString()
        for i in 0 ..< digestLen {
            hash.appendFormat("%02x", result[i])
        }
        free(result)
        return String(format: hash as String)
    }
}

用法:

let str = "xxx"
let sign = str.md5()
print("result in \(sign)")

发现Swift支持了namespace后,再也不用导一大推头文件了,又想到隔壁的Java早就支持了,瞬间感觉OC Low了很多;Swift不是纯面向对象的语言,这意味着,函数可以单独写在一个文件里,直接调用;struct也升级到将要和class平起平坐的地位,enum强大的令人难以置信;还有很多新特性,像一个个黑魔法,有着无限魔力,令人着迷。接下来,会继续探索,Swift,你上车了吗?

2016-07-13 09:01:54 yaojinhai06 阅读数 9946

Swift MD5加密在github有一个非常好的第三方库,使用也比较简单,还有很多加密方法,如果需要,点击这里下载

 对于那些不需要太多的加密,只需要MD5加密的同学,我建议还是不要用第三方库.

  因为第三方包很大,而且每次使用还需要引入包,相对来说比较复杂,不如直接写一个方法比较简单.

  下面就是MD5加密的方法.


func md5String(str:String) -> String{
    let cStr = str.cStringUsingEncoding(NSUTF8StringEncoding);
    let buffer = UnsafeMutablePointer<UInt8>.alloc(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
}


如果你直接把我的代码复制到你的工程文件里,是不能编译过去的,那是为什么呢,错了么,还是误导呢.在这里先声明一下. 看文章一定要看完再下结论.不然,都不知道,我在写什么.废话少说了.下面接着看.

首先创建一个xxx-Bridging-Header.h桥接文件,这个文件怎么创建呢,如果实在不知道请Google.好吧.

 如果继续往下看,就不需要谷歌了.common+N创建一个oc类,会自动提示是否创建一个桥接文件,点击创建即可.

如下图:

  


第二步,你会在下边的图中看到一个文件的名字,和这个是一样的.




那就说明OK了,如果没有,请手动添加了.


最后一步在,这个文件里导入<CommonCrypto/CommonDigest.h>这个文件.再编译一次,就OK了.



2017-03-15 15:45:47 fzhlee 阅读数 6683

       在大多数的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





MD5加密 Swift

阅读数 82

Swift版MD5加密

阅读数 761

swift-MD5加密

阅读数 1475