আমি কীভাবে আইআরএসে সুইফট ব্যবহার করে কোনও স্ট্রিংকে এমডি 5 হ্যাশে রূপান্তর করতে পারি?


111

আমি "abc" এর মতো একটি স্ট্রিংকে MD5 হ্যাশে রূপান্তর করতে চাই। আমি এটি আইওএস এবং সুইফটে করতে চাই। আমি নীচের সমাধানগুলি ব্যবহার করার চেষ্টা করেছি কিন্তু তারা আমার পক্ষে কাজ করছে না:

একটি সুইফট ফ্রেমওয়ার্কে কমনক্রিপ্টো আমদানি করা

কীভাবে সিসি_এমডি 5 পদ্ধতিটি দ্রুতগতিতে ব্যবহার করতে হয়।

http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/

আরও পরিষ্কার হতে, আমি এই পিএইচপি কোডের আউটপুটটির অনুরূপ সুইফটে একটি আউটপুট অর্জন করতে চাই:

$str = "Hello";

echo md5($str);

আউটপুট: 8 বি 1 এ 9953c4611296a827abf8c47804d7


5
আপনার দেওয়া লিঙ্কগুলিতে কী ভুল?
jtbandes

2
আপনার দেওয়া লিঙ্কগুলি কাজ করা উচিত। আপনার সঠিক সমস্যাটি কি আপনি বর্ণনা করতে পারেন? আপনি যা চান তা করতে তৃতীয় পক্ষের লাইব্রেরিও অন্তর্ভুক্ত করতে পারেন, যেমন। github.com/krzyzanowskim/CryptoSwift
এরিক আমর্ডে 23'15

1
আমি যেমন উল্লেখ করেছি যে আমি ইমামে সুইফ্ট প্রোগ্রামিংয়ে সঠিকভাবে এটি কার্যকর করতে আমি বিভ্রান্ত হয়ে পড়েছিলাম। আমি এই ফাইলটি (# ইম্পোর্ট <কমনক্রিপ্টো / কমনক্রিপ্টো.এইচ)> সুইফট কন্ট্রোলার ফাইলটিতে অন্তর্ভুক্ত করছি। তবে আপনার উত্তরগুলির জন্য ধন্যবাদ, এটি এখন নীচে দেওয়া মিঃজ্যাফ উত্তর দ্বারা সমাধান করা হয়েছে।
ব্যবহারকারী3606682

আপনি যদি সুইফটে
onmyway133

উত্তর:


178

দুটি পদক্ষেপ রয়েছে:
1. স্ট্রিং থেকে এমডি 5 ডেটা তৈরি করুন
2. এমডি 5 ডেটা একটি হেক্স স্ট্রিংয়ে প্রচ্ছদ করুন

সুইফট ২.০:

func md5(string string: String) -> String {
    var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)
    if let data = string.dataUsingEncoding(NSUTF8StringEncoding) {
        CC_MD5(data.bytes, CC_LONG(data.length), &digest)
    }

    var digestHex = ""
    for index in 0..<Int(CC_MD5_DIGEST_LENGTH) {
        digestHex += String(format: "%02x", digest[index])
    }

    return digestHex
}

//Test:
let digest = md5(string:"Hello")
print("digest: \(digest)")

আউটপুট:

ডাইজেস্ট: 8 বি 1 এ 9953c4611296a827abf8c47804d7

সুইফট 3.0:

func MD5(string: String) -> Data {
    let messageData = string.data(using:.utf8)!
    var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))

    _ = digestData.withUnsafeMutableBytes {digestBytes in
        messageData.withUnsafeBytes {messageBytes in
            CC_MD5(messageBytes, CC_LONG(messageData.count), digestBytes)
        }
    }

    return digestData
}

//Test:
let md5Data = MD5(string:"Hello")

let md5Hex =  md5Data.map { String(format: "%02hhx", $0) }.joined()
print("md5Hex: \(md5Hex)")

let md5Base64 = md5Data.base64EncodedString()
print("md5Base64: \(md5Base64)")

আউটপুট:

md5Hex: 8b1a9953c4611296a827abf8c47804d7
md5Base64: ixqZU8RhEpaoJ6v4xHgE1w ==

সুইফ্ট 5.0:

import Foundation
import var CommonCrypto.CC_MD5_DIGEST_LENGTH
import func CommonCrypto.CC_MD5
import typealias CommonCrypto.CC_LONG

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
    }

//Test:
let md5Data = MD5(string:"Hello")

let md5Hex =  md5Data.map { String(format: "%02hhx", $0) }.joined()
print("md5Hex: \(md5Hex)")

let md5Base64 = md5Data.base64EncodedString()
print("md5Base64: \(md5Base64)")

আউটপুট:

md5Hex: 8b1a9953c4611296a827abf8c47804d7
md5Base64: ixqZU8RhEpaoJ6v4xHgE1w ==

নোটস:
#import <CommonCrypto/CommonCrypto.h>একটি ব্রিজিং-শিরোনাম ফাইলটিতে অবশ্যই যুক্ত করা উচিত

কিভাবে একটি ব্রিজিং-শিরোনাম তৈরি করবেন তার এই উত্তরটি দেখুন

সাধারণভাবে MD5 নতুন কাজের জন্য ব্যবহার করা উচিত নয়, SHA256 বর্তমানের সেরা অনুশীলন।

অবহেলিত ডকুমেন্টেশন বিভাগ থেকে উদাহরণ:

MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384, SHA512 (সুইফট 3+)

এই ফাংশনগুলির মধ্যে আটটি ক্রিপ্টোগ্রাফিক হ্যাশ অ্যালগরিদমের সাথে স্ট্রিং বা ডেটা ইনপুট হবে।

নামের প্যারামিটারটি হ্যাশ ফাংশনটির নাম নির্দিষ্ট করে কারণ স্ট্রিং
সমর্থিত ফাংশনগুলি হ'ল MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384 এবং SHA512 এবং এই উদাহরণটিতে কমন ক্রিপ্টো
প্রয়োজন প্রজেক্টে একটি ব্রিজিং শিরোনাম থাকা দরকার:
#import <CommonCrypto/CommonCrypto.h>
সুরক্ষা যুক্ত করুন প্রকল্পের ফ্রেমওয়ার্ক।



এই ফাংশনটিতে একটি হ্যাশ নাম এবং স্ট্রিং হ্যাশ হতে লাগে এবং একটি ডেটা ফেরত দেয়:

নাম: একটি স্ট্রিং হিসাবে একটি হ্যাশ ফাংশনের একটি নাম  
স্ট্রিং: স্ট্রিং হ্যাশ করা  
রিটার্ন দেয়: ডেটা হিসাবে হ্যাশ ফলাফল  
func hash(name:String, string:String) -> Data? {
    let data = string.data(using:.utf8)!
    return hash(name:name, data:data)
}

উদাহরণ:

let clearString = "clearData0123456"
let clearData   = clearString.data(using:.utf8)!
print("clearString: \(clearString)")
print("clearData: \(clearData as NSData)")

let hashSHA256 = hash(name:"SHA256", string:clearString)
print("hashSHA256: \(hashSHA256! as NSData)")

let hashMD5 = hash(name:"MD5", data:clearData)
print("hashMD5: \(hashMD5! as NSData)")

আউটপুট:

clearString: clearData0123456
clearData: <636c6561 72446174 61303132 33343536>

hashSHA256: <aabc766b 6b357564 e41f4f91 2d494bcc bfa16924 b574abbd ba9e3e9d a0c8920a>
hashMD5: <4df665f7 b94aea69 695b0e7b baf9e9d6>

3
ধন্যবাদ এলট @ জাফ, আমি 2 দিনেরও বেশি সময় থেকে এটির জন্য লড়াই করছি। এটি আপনার উপরের উত্তরের সাথে সমাধান হয়েছে :) এবং হ্যাঁ এমডি 5 ব্যবহার করা হয় এমন ওয়েব থেকে পুরানো ডেটা উদ্ধার করছি, সুতরাং এমডি এমডি 5 ব্যবহার করতে বাধ্য হলাম। তবে SHA256 ব্যবহারের উত্তর এবং পরামর্শের জন্য আবার ধন্যবাদ :)
ব্যবহারকারীর 606682

String(data: digestData, encoding: String.Encoding.utf8)ছোঁড়াfatal error: unexpectedly found nil while unwrapping an Optional value
সিদ্ধার্থ

@ সিদ্ধার্থ মন্তব্যে পর্যাপ্ত তথ্য নেই, এটি কী তা পরিষ্কার নয় digestData। যদি হ্যাশ ডেটা সম্ভাবনা অথবা হচ্ছে হল UTF-8 (অথবা কোন স্ট্রিং এনকোডিং অবাস্তব করার পাতলা হয়।
zaph

1
আপনি এটি কীভাবে উন্নতি করতে পারেন তা এখানে: কেবলমাত্র প্রয়োজনীয় প্রতীকগুলিই আমদানি করুন, পুরো কমনক্রিপ্টো নয়, কারণ এটি ওভারহেডের কিছুটা নয় অন্যথায়: আমদানি করুন VarCrypto.CC_MD5_DIGEST_LENGTH আমদানি টাইপ করুন কমনক্রিপ্টো.সিসি_এমডি 5 আমদানি টাইপালিয়ানস কমনক্রিপ্টো.সিসি_লং
ইগোর

2
: @zaph আপনি আপনার উত্তর যা আমি নীচের আমার উত্তরে বিস্তারিত করার আইওএস 13 CryptoKit সমাধান যোগ করতে পারেন stackoverflow.com/a/56578995/368085
mluisbrown

39

এখানে অন্যান্য উত্তরগুলি পড়ার পরে (এবং পাশাপাশি অন্যান্য হ্যাশ ধরণের সমর্থন করা প্রয়োজন) আমি একটি স্ট্রিং এক্সটেনশন লিখেছিলাম যা একাধিক হ্যাশ ধরণের এবং আউটপুট প্রকারগুলি পরিচালনা করে।

দ্রষ্টব্য: কমনক্রিপ্টোটি এক্সকোড 10 এ অন্তর্ভুক্ত করা হয়েছে, সুতরাং আপনি import CommonCryptoযদি সর্বশেষে এক্সকোড সংস্করণ ইনস্টল করেন তবে ব্রিজিং শিরোনামের সাথে গোলমাল না করেই আপনি পারবেন ... অন্যথায় একটি ব্রিজিং শিরোলেখ প্রয়োজনীয়।


আপডেট: সুইফট 4 এবং 5 উভয়ই নীচে একই স্ট্রিং + ক্রিপ্টো.সুইফ্ট ফাইল ব্যবহার করে।

সুইফট 5 এবং 5 এর মধ্যে পরিবর্তিত 'উইনস্যাফমুটেবলবাইটস' এবং 'উইথ ইউনসেফবাইটস' এর এপিআই হিসাবে সুইফট 5 (নীচে দেখুন) এর জন্য আলাদা তথ্য + ক্রিপ্টো.সুইফ্ট ফাইল রয়েছে।


স্ট্রিং + ক্রিপ্টো.সুইফ্ট - (সুইফট 4 এবং 5 উভয়ের জন্য)

import Foundation
import CommonCrypto

// Defines types of hash string outputs available
public enum HashOutputType {
    // standard hex string output
    case hex
    // base 64 encoded string output
    case base64
}

// Defines types of hash algorithms available
public enum HashType {
    case md5
    case sha1
    case sha224
    case sha256
    case sha384
    case sha512

    var length: Int32 {
        switch self {
        case .md5: return CC_MD5_DIGEST_LENGTH
        case .sha1: return CC_SHA1_DIGEST_LENGTH
        case .sha224: return CC_SHA224_DIGEST_LENGTH
        case .sha256: return CC_SHA256_DIGEST_LENGTH
        case .sha384: return CC_SHA384_DIGEST_LENGTH
        case .sha512: return CC_SHA512_DIGEST_LENGTH
        }
    }
}

public extension String {

    /// Hashing algorithm for hashing a string instance.
    ///
    /// - Parameters:
    ///   - type: The type of hash to use.
    ///   - output: The type of output desired, defaults to .hex.
    /// - Returns: The requested hash output or nil if failure.
    public func hashed(_ type: HashType, output: HashOutputType = .hex) -> String? {

        // convert string to utf8 encoded data
        guard let message = data(using: .utf8) else { return nil }
        return message.hashed(type, output: output)
    } 
}

সুইফট 5 - ডেটা + ক্রিপ্টো.সুইফ্ট

import Foundation
import CommonCrypto

extension Data {

    /// Hashing algorithm that prepends an RSA2048ASN1Header to the beginning of the data being hashed.
    ///
    /// - Parameters:
    ///   - type: The type of hash algorithm to use for the hashing operation.
    ///   - output: The type of output string desired.
    /// - Returns: A hash string using the specified hashing algorithm, or nil.
    public func hashWithRSA2048Asn1Header(_ type: HashType, output: HashOutputType = .hex) -> String? {

        let rsa2048Asn1Header:[UInt8] = [
            0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
            0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00
        ]

        var headerData = Data(rsa2048Asn1Header)
        headerData.append(self)

        return hashed(type, output: output)
    }

    /// Hashing algorithm for hashing a Data instance.
    ///
    /// - Parameters:
    ///   - type: The type of hash to use.
    ///   - output: The type of hash output desired, defaults to .hex.
    ///   - Returns: The requested hash output or nil if failure.
    public func hashed(_ type: HashType, output: HashOutputType = .hex) -> String? {

        // setup data variable to hold hashed value
        var digest = Data(count: Int(type.length))

        _ = digest.withUnsafeMutableBytes{ digestBytes -> UInt8 in
            self.withUnsafeBytes { messageBytes -> UInt8 in
                if let mb = messageBytes.baseAddress, let db = digestBytes.bindMemory(to: UInt8.self).baseAddress {
                    let length = CC_LONG(self.count)
                    switch type {
                    case .md5: CC_MD5(mb, length, db)
                    case .sha1: CC_SHA1(mb, length, db)
                    case .sha224: CC_SHA224(mb, length, db)
                    case .sha256: CC_SHA256(mb, length, db)
                    case .sha384: CC_SHA384(mb, length, db)
                    case .sha512: CC_SHA512(mb, length, db)
                    }
                }
                return 0
            }
        }

        // return the value based on the specified output type.
        switch output {
        case .hex: return digest.map { String(format: "%02hhx", $0) }.joined()
        case .base64: return digest.base64EncodedString()
        }
    }
}

সুইফট 4 - ডেটা + ক্রিপ্টো.সুইফ্ট

import Foundation
import CommonCrypto 

extension Data {

    /// Hashing algorithm that prepends an RSA2048ASN1Header to the beginning of the data being hashed.
    ///
    /// - Parameters:
    ///   - type: The type of hash algorithm to use for the hashing operation.
    ///   - output: The type of output string desired.
    /// - Returns: A hash string using the specified hashing algorithm, or nil.
    public func hashWithRSA2048Asn1Header(_ type: HashType, output: HashOutputType = .hex) -> String? {

        let rsa2048Asn1Header:[UInt8] = [
            0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
            0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00
        ]

        var headerData = Data(bytes: rsa2048Asn1Header)
        headerData.append(self)

        return hashed(type, output: output)
    }

    /// Hashing algorithm for hashing a Data instance.
    ///
    /// - Parameters:
    ///   - type: The type of hash to use.
    ///   - output: The type of hash output desired, defaults to .hex.
    ///   - Returns: The requested hash output or nil if failure.
    public func hashed(_ type: HashType, output: HashOutputType = .hex) -> String? {

        // setup data variable to hold hashed value
        var digest = Data(count: Int(type.length))

        // generate hash using specified hash type
        _ = digest.withUnsafeMutableBytes { (digestBytes: UnsafeMutablePointer<UInt8>) in
            self.withUnsafeBytes { (messageBytes: UnsafePointer<UInt8>) in
                let length = CC_LONG(self.count)
                switch type {
                case .md5: CC_MD5(messageBytes, length, digestBytes)
                case .sha1: CC_SHA1(messageBytes, length, digestBytes)
                case .sha224: CC_SHA224(messageBytes, length, digestBytes)
                case .sha256: CC_SHA256(messageBytes, length, digestBytes)
                case .sha384: CC_SHA384(messageBytes, length, digestBytes)
                case .sha512: CC_SHA512(messageBytes, length, digestBytes)
                }
            }
        }

        // return the value based on the specified output type.
        switch output {
        case .hex: return digest.map { String(format: "%02hhx", $0) }.joined()
        case .base64: return digest.base64EncodedString()
        }
    }
}

সম্পাদনা করুন: যেহেতু হ্যাশটি ডেটাতে আসলে ঘটে তাই আমি হ্যাশিং অ্যালগরিদমকে ডেটা এক্সটেনশনে বিভক্ত করি। এটি এসএসএল শংসাপত্রের পিনিং হ্যাশ ক্রিয়াকলাপগুলির জন্য একই অ্যালগরিদমকেও ব্যবহার করতে দেয়।

আপনি কীভাবে এটি একটি এসএসএল পিনিং অপারেশনের জন্য ব্যবহার করতে পারেন তার একটি সংক্ষিপ্ত উদাহরণ এখানে:

// Certificate pinning - get certificate as data
let data: Data = SecCertificateCopyData(serverCertificate) as Data

// compare hash of server certificate with local (expected) hash value
guard let serverHash = data.hashWithRSA2048Asn1Header(.sha256, output: .base64), serverHash == storedHash else {
    print("SSL PINNING: Server certificate hash does not match specified hash value.")
    return false
}

মূল উত্তর ফিরে

আমি এটি ব্যবহার করে হ্যাশ অ্যালগরিদমগুলি পরীক্ষা করেছি:

let value = "This is my string"

if let md5 = value.hashed(.md5) {
    print("md5: \(md5)")
}
if let sha1 = value.hashed(.sha1) {
    print("sha1: \(sha1)")
}
if let sha224 = value.hashed(.sha224) {
    print("sha224: \(sha224)")
}
if let sha256 = value.hashed(.sha256) {
    print("sha256: \(sha256)")
}
if let sha384 = value.hashed(.sha384) {
    print("sha384: \(sha384)")
}
if let sha512 = value.hashed(.sha512) {
    print("sha512: \(sha512)")
}

এবং এটি মুদ্রিত ফলাফল:

md5: c2a9ce57e8df081b4baad80d81868bbb
sha1: 37fb219bf98bee51d2fdc3ba6d866c97f06c8223
sha224: f88e2f20aa89fb4dffb6bdc62d7bd75e1ba02574fae4a437c3bf49c7
sha256: 9da6c02379110815278b615f015f0b254fd3d5a691c9d8abf8141655982c046b
sha384: d9d7fc8aefe7f8f0a969b132a59070836397147338e454acc6e65ca616099d03a61fcf9cc8c4d45a2623145ebd398450
sha512: 349cc35836ba85915ace9d7f895b712fe018452bb4b20ff257257e12adeb1e83ad780c6568a12d03f5b2cb1e3da23b8b7ced9012a188ef3855e0a8f3db211883

39

আইওএস ১৩ হিসাবে অ্যাপল CryptoKitফ্রেমওয়ার্কটি যুক্ত করেছে যাতে আপনার আর কমনক্রিপ্টো আমদানি করতে বা এর সিপিআইপি ব্যবহার করার দরকার নেই:

import Foundation
import CryptoKit

func MD5(string: String) -> String {
    let digest = Insecure.MD5.hash(data: string.data(using: .utf8) ?? Data())

    return digest.map {
        String(format: "%02hhx", $0)
    }.joined()
}

3
এটিও লক্ষণীয় যে এটি এমডি 5 এর সম্পর্কে সতর্কতা এড়ানো এখন নিরাপদ হওয়ার জন্য একটি উপায় সরবরাহ করে। আপনাকে উদ্দেশ্য-সি তে কমনক্রিপ্টো প্রয়োগ করার দরকার নেই যাতে সতর্কতাটি অক্ষম করার জন্য আপনার প্রাগমাসের সমর্থন থাকে। আপনি যদি এমন পরিবেশে কাজ করছেন যা সতর্কতার সাথে মোকাবিলায় জোর দেয়।
marcus.amsden

28

SWIFT 3সংস্করণ md5 function:

func md5(_ string: String) -> String {

    let context = UnsafeMutablePointer<CC_MD5_CTX>.allocate(capacity: 1)
    var digest = Array<UInt8>(repeating:0, count:Int(CC_MD5_DIGEST_LENGTH))
    CC_MD5_Init(context)
    CC_MD5_Update(context, string, CC_LONG(string.lengthOfBytes(using: String.Encoding.utf8)))
    CC_MD5_Final(&digest, context)
    context.deallocate(capacity: 1)
    var hexString = ""
    for byte in digest {
        hexString += String(format:"%02x", byte)
    }

    return hexString
}

মূল লিঙ্কটি থেকে: http://iosdeveloperzone.com


23

সুইফট 4. *, এক্সকোড 10 আপডেট:

এক্সকোড 10 এ আপনাকে ব্রিজিং-শিরোনাম আর ব্যবহার করতে হবে না , আপনি সরাসরি ব্যবহার করে আমদানি করতে পারেন

import CommonCrypto

এবং তারপরে একটি পদ্ধতি এমনভাবে লিখুন:

func MD5(_ string: String) -> String? {
        let length = Int(CC_MD5_DIGEST_LENGTH)
        var digest = [UInt8](repeating: 0, count: length)

        if let d = string.data(using: String.Encoding.utf8) {
            _ = d.withUnsafeBytes { (body: UnsafePointer<UInt8>) in
                CC_MD5(body, CC_LONG(d.count), &digest)
            }
        }

        return (0..<length).reduce("") {
            $0 + String(format: "%02x", digest[$1])
        }
    }

ব্যবহার:

MD5("This is my string")

আউটপুট:

c2a9ce57e8df081b4baad80d81868bbb

আপনার সমাধান নিখুঁতভাবে কাজ করা হয়। আমরা এই এমডি 5 এনক্রিপশন দিয়ে সল্ট মান যুক্ত করতে পারি? স্ট্রিংয়ের এনক্রিপশন করার সময় আমি যুক্ত করতে চাই। আপনি কিছু ব্যবহার পূর্ণ লিঙ্ক প্রদান করতে পারেন?
পুনিতা

আপনি কী অর্জন করার চেষ্টা করছেন তা আমি নিশ্চিত নই। যদি আপনি সল্টিংয়ের সাথে কাস্টম এনক্রিপশন চান তবে "AES128" ব্যবহার করুন। সুরক্ষা যদি আপনার উদ্বেগের বিষয় থাকে তবে এটি দেখুন: stackoverflow.com/a/15775071/3118377
ইনভিক্টাস কোডি

ধন্যবাদ ইনভিটিকাস কোডি, আমি স্ট্রিংয়ের সাথে স্যালটেটেট স্যালেট করেছি এবং এমডি 5 পেতে সক্ষম হয়েছি।
পুনিতা

দুর্দান্ত কাজ করে। তবে আপনি কীভাবে এটিকে স্ট্রিংয়ে ফিরিয়ে আনবেন?
DocAsh59

1
সুইফট 5:func MD5(_ string: String) -> String? { let length = Int(CC_MD5_DIGEST_LENGTH) var digest = [UInt8](repeating: 0, count: length) if let d = string.data(using: .utf8) { _ = d.withUnsafeBytes { body -> String in CC_MD5(body.baseAddress, CC_LONG(d.count), &digest) return "" } } return (0..<length).reduce("") { $0 + String(format: "%02x", digest[$1]) } }
জিম বি

17

আমি একটি খাঁটি সুইফ্ট বাস্তবায়ন প্রকাশ করেছি যা কমনক্রিপ্টো বা অন্য কোনও কিছুর উপর নির্ভর করে না। এটি এমআইটি লাইসেন্সের অধীনে উপলব্ধ।

কোডটিতে একটি একক সুইফট ফাইল রয়েছে যা আপনি কেবল আপনার প্রকল্পে ফেলে দিতে পারেন। আপনি যদি পছন্দ করেন তবে আপনি ফ্রেমওয়ার্ক এবং ইউনিট পরীক্ষার টার্গেট সহ থাকা এক্সকোড প্রকল্পটিও ব্যবহার করতে পারেন।

এটি ব্যবহার করা সহজ:

let input = "The quick brown fox jumps over the lazy dog"
let digest = input.utf8.md5
print("md5: \(digest)")

কপি করে প্রিন্ট: md5: 9e107d9d372bb6826bd81d3542a419d6

সুইফ্ট ফাইলটিতে ডকুমেন্টেশন এবং আরও উদাহরণ রয়েছে।


4
সুইফট 4 প্রয়োজন যা এখানে বা গিথুব রিডমিতে উল্লিখিত হয়নি। কমন ক্রিপ্টোর তুলনায় কর্মক্ষমতা পরিসংখ্যান ব্যতীত ব্যবহার বিবেচনা করা উচিত নয়। দ্রষ্টব্য: সাধারণ ক্রিপ্টো হ'ল এফএডি 140 শংসিত, সুইফটডিজাস্ট নয়। মূল প্রশ্নটি এখানে: বাস্তবায়নের জন্য এটি কমন ক্রিপ্টোর থেকে আরও কীভাবে ভাল? আরও সুরক্ষিত: না, দ্রুত: না
zaph

1
@ জাফ মূল উদ্দেশ্যটি একটি এমডি 5 বাস্তবায়ন যা কমনক্রিপটোর উপর নির্ভর করে না। কমনক্রিপ্টো পাওয়া যায় না এমন পরিস্থিতিতে এটি সহায়ক Sw যেমন সুইফট ফ্রেমওয়ার্ক লক্ষ্যমাত্রা বা নন-অ্যাপল প্ল্যাটফর্মগুলিতে।
নিকোলাই রুহে

4
@ জাফ আমি সম্মত যে সুরক্ষা প্রাসঙ্গিক বাস্তবায়নগুলি হালকাভাবে নেওয়া উচিত নয়। তবে এমডি 5 এর সুরক্ষা ছাড়াও অন্যান্য ব্যবহার রয়েছে security বা, পরিবর্তে, সুরক্ষা যেখানে এমডি 5 সবচেয়ে খারাপ কাজ করে। হ্যাশিং অ্যালগরিদম সনাক্তকরণ, বাছাই, সঞ্চয়স্থান, অভিধান, ত্রুটি সনাক্তকরণ এবং অন্যান্য কারণে ব্যবহৃত হয়। MD5 এর সর্বব্যাপী কারণে বিশেষত কার্যকর। সুতরাং, আমি যখন আপনার কয়েকটি মন্তব্যের সাথে একমত হই তখন আমি সংক্ষেপের সাথে একমত নই। আমি মনে করি আপনার দৃষ্টিভঙ্গি এবং তর্কটি খুব সংকীর্ণ; এটি পুরো বিষয়টিকে ঘিরে রাখে না।
নিকোলাই রুহে

2
এছাড়াও, আমি শুধু পরীক্ষিত, এবং আমার বাস্তবায়ন বড় বার্তাগুলির জন্য :) দ্রুত CommonCrypto চেয়ে
নিকোলাই Ruhe

2
আমি এই বাস্তবায়ন পছন্দ। অনেক ধন্যবাদ @ নিকোলাইরুহে! আমি এটিকে সহজেই সুইফট 3 সামঞ্জস্যতে রূপান্তর করতে সক্ষম হয়েছি। আমি একটি ইউআরএল দেওয়া ফাইল সামগ্রীর ডাইজেস্ট গণনা করা এবং বেস 64৪ টি এনকোডিং (অন্যান্য বিষয়গুলির মধ্যে সামগ্রী-এমডি 5 এর জন্য দরকারী) সহ কয়েকটি সুবিধামত পদ্ধতি যুক্ত করেছি। @ সিদ্ধার্থ আপনার কেবলমাত্র ফাইলের দরকার এমডি 5 ডিজেস্ট.সুইফ্ট।
বায়োমিকার

10

এখানে মাত্র দুটি নোট:

কেবল এটি অর্জনের জন্য ক্রিপ্টো ব্যবহার করা খুব বেশি ওভারহেড।

গৃহীত উত্তর নিখুঁত! তবুও আমি স্যুইফ্ট ২.২ ব্যবহার করে একটি সুইফট আইয়ার কোড পন্থা ভাগ করে নিতে চেয়েছিলাম ।

দয়া করে মনে রাখবেন যে আপনাকে এখনও #import <CommonCrypto/CommonCrypto.h>আপনার ব্রিজিং-শিরোনাম ফাইলটিতে থাকতে হবে

struct MD5Digester {
    // return MD5 digest of string provided
    static func digest(string: String) -> String? {

        guard let data = string.dataUsingEncoding(NSUTF8StringEncoding) else { return nil }

        var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)

        CC_MD5(data.bytes, CC_LONG(data.length), &digest)

        return (0..<Int(CC_MD5_DIGEST_LENGTH)).reduce("") { $0 + String(format: "%02x", digest[$1]) }
    }
}

7

স্ট্রিং এক্সটেনশন হিসাবে সুইফ্ট 5 উত্তর ( ইনভিকটাস কোডির দুর্দান্ত উত্তরের উপর ভিত্তি করে ):

import CommonCrypto

extension String {
    var md5Value: String {
        let length = Int(CC_MD5_DIGEST_LENGTH)
        var digest = [UInt8](repeating: 0, count: length)

        if let d = self.data(using: .utf8) {
            _ = d.withUnsafeBytes { body -> String in
                CC_MD5(body.baseAddress, CC_LONG(d.count), &digest)

                return ""
            }
        }

        return (0 ..< length).reduce("") {
            $0 + String(format: "%02x", digest[$1])
        }
    }
}

ব্যবহার:

print("test".md5Value) /*098f6bcd4621d373cade4e832627b4f6*/

6

জাফ উত্তরের উপর ভিত্তি করে এখানে একটি এক্সটেনশন

extension String{
    var MD5:String {
        get{
            let messageData = self.data(using:.utf8)!
            var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))

            _ = digestData.withUnsafeMutableBytes {digestBytes in
                messageData.withUnsafeBytes {messageBytes in
                    CC_MD5(messageBytes, CC_LONG(messageData.count), digestBytes)
                }
            }

            return digestData.map { String(format: "%02hhx", $0) }.joined()
        }
    }
}

সম্পূর্ণরূপে সুসংগত দ্রুতগতি সঙ্গে 3.0.you এখনো আছে #import <CommonCrypto/CommonCrypto.h>আপনার গণনার জমকালো অনুষ্ঠান-শিরোলেখ ফাইলে


3

সুইফ্ট প্রোগ্রামিংয়ে স্ট্রিং ফাংশন করা এর থেকে ভাল, যাতে ব্যবহার সহজ হবে। এখানে আমি উপরের প্রদত্ত সমাধানগুলির মধ্যে একটি ব্যবহার করে একটি স্ট্রিং এক্সটেনশন করছি। ধন্যবাদ @ ওয়াজিহ

import Foundation
import CommonCrypto

extension String {

func md5() -> String {

    let context = UnsafeMutablePointer<CC_MD5_CTX>.allocate(capacity: 1)
    var digest = Array<UInt8>(repeating:0, count:Int(CC_MD5_DIGEST_LENGTH))
    CC_MD5_Init(context)
    CC_MD5_Update(context, self, CC_LONG(self.lengthOfBytes(using: String.Encoding.utf8)))
    CC_MD5_Final(&digest, context)
    context.deallocate()
    var hexString = ""
    for byte in digest {
        hexString += String(format:"%02x", byte)
    }

    return hexString
}
}

ব্যবহার

let md5String = "abc".md5()

1

আমি এটি করতে কার্থেজ এবং সিরপ্টো ব্যবহার করেছি।

  1. আপনি যদি ইতিমধ্যে এটি না করে থাকেন তবে কার্থেজ ইনস্টল করুন

  2. আপনার প্রকল্পে ক্রিপ্টো ইনস্টল করুন

  3. 'কার্টেজ আপডেট' চালানো

  4. আপনি যদি কমান্ডলাইনটি থেকে চালাচ্ছেন তবে সুইফ্ট ফাইলের ফ্রেমওয়ার্কে অ্যাড করুন

    #!/usr/bin/env xcrun swift -F Carthage/Build/Mac
  5. আপনার সুইফ্ট ফাইলটিতে আমদানি ক্রিপ্টো যুক্ত করুন।

  6. তাহলে এটি ঠিক কাজ করে!

    print( "convert this".MD5 )

কেবলমাত্র একটি ফাংশন প্রয়োজন হলে পূর্ণ ক্রিপ্টোগ্রাফি লাইব্রেরিটি ব্যবহার করা শীর্ষের কিছুটা উপরে
মার্ক বউর্ক

পুরানো-থ্রেড মন্তব্যের জন্য ক্ষমা প্রার্থনা করুন ... সম্ভবত, তবে সাধারণ গ্রন্থাগারগুলি প্ল্যাটফর্মের পরিবর্তনের সাথে সর্বদা আপাতত অবধি থাকে (ফলস্বরূপ) সাধারণ ফলাফল পাওয়া যায় এবং খণ্ডনকে হ্রাস করা যায় এবং কাউকে ক্রমাগত চাকা পুনরায় উদ্ভাবন করতে বা গুচ্ছ ইন্টারনেট- ব্যবহার করতে হয় না কোড খুঁজে পেয়েছে যা বিশ্বাসযোগ্য, দ্রুত, বা মান অনুসারে নকশাকৃত হতে পারে। আমি নির্ভরশীলতা হ্রাস করার জন্য সমস্তই, তবে এর মতো কিছুতে আমি প্রথমে ওএস অপশনগুলি, সাধারণ ভাষার বিকল্পগুলি দ্বিতীয় এবং তৃতীয় পক্ষের স্ট্যান্ডার্ড বিকল্পগুলির পরে দেখি, এবং ফলস্বরূপ এক-অফ বা "এই লোকটির পাঠাগারটি বেশ ভাল" বিকল্পগুলি শেষ। *
শ্রাগ

1

এমডি 5 হ্যাশিং অ্যালগরিদম, এর জন্য প্রচুর পরিমাণে কমনক্রিপ্টো লাইব্রেরি ব্যবহার করার দরকার নেই (এবং অ্যাপল পর্যালোচনা দ্বারা প্রত্যাখ্যান করা হবে), কেবল কোনও এমডি 5 হ্যাশিং লাইব্রেরি ব্যবহার করুন।

আমি ব্যবহার করি এমন একটি লাইব্রেরি হ'ল সুইফটহ্যাশ , এমডি 5 এর খাঁটি সুইফ্ট বাস্তবায়ন ( http://pajhome.org.uk/crypt/md5/md5.html এর উপর ভিত্তি করে )


1

কোডির সমাধানের ভিত্তিতে আমার একটি ধারণা রয়েছে যে MD5 এর ফলাফল কী তা আমাদের পরিষ্কার করা উচিত, কারণ আমরা ফলাফলটিকে হেক্স স্ট্রিং বা বেস 64 স্ট্রিং হিসাবে ব্যবহার করতে পারি।

func md5(_ string: String) -> [UInt8] {
    let length = Int(CC_MD5_DIGEST_LENGTH)
    var digest = [UInt8](repeating: 0, count: length)

    if let d = string.data(using: String.Encoding.utf8) {
        _ = d.withUnsafeBytes { (body: UnsafePointer<UInt8>) in
            CC_MD5(body, CC_LONG(d.count), &digest)
        }
    }
    return digest
}

উপরের ফাংশনটি আসলে একটি ফেরত দেয় [UInt8]এবং এই ফলাফলের উপর ভিত্তি করে আমরা কোনও স্ট্রিং যেমন হেক্স, বেস 64 পেতে পারি 64

যদি কোনও হেক্স স্ট্রিং চূড়ান্ত ফলাফল হিসাবে চাওয়া হয় (যেমন প্রশ্ন জিজ্ঞাসা করে), আমরা কোডির সমাধানের বাকি অংশটি ব্যবহার করতে পারি

extension String {
    var md5Hex: String {
        let length = Int(CC_MD5_DIGEST_LENGTH)
        return (0..<length).reduce("") {
            $0 + String(format: "%02x", digest[$1])
        }
    }
}

যদি একটি বেস 64 স্ট্রিং চূড়ান্ত ফলাফল হিসাবে চাওয়া হয়

extension String {
    var md5Base64: String {
        let md5edData = Data(bytes: md5(self))
        return md5edData.base64EncodedString()
    }
}

1

যথাযথ মেমরি পরিচালনা এবং পদ্ধতির অভ্যন্তরে শ্রেণিবিহীন সুইফট 5 এর একটি উত্তর String:

typealias CBridgeCryptoMethodType = (UnsafeRawPointer?,
                                 UInt32,
                                 UnsafeMutablePointer<UInt8>?)
-> UnsafeMutablePointer<UInt8>?

private enum HashType {

    // MARK: - Cases

    case md5
    case sha1
    case sha224
    case sha256
    case sha384
    case sha512
}

extension Data {
    var hexString: String {
        let localHexString = reduce("", { previous, current in
            return previous + String(format: "%02X", current)
        })
        return localHexString
    }
    var md5: Data {
        return hashed(for: .md5)
    }
    var sha1: Data {
        return hashed(for: .sha1)
    }
    var sha224: Data {
        return hashed(for: .sha224)
    }
    var sha256: Data {
        return hashed(for: .sha256)
    }
    var sha384: Data {
        return hashed(for: .sha384)
    }
    var sha512: Data {
        return hashed(for: .sha512)
    }

    private func hashed(for hashType: HashType) -> Data {
        return withUnsafeBytes { (rawBytesPointer: UnsafeRawBufferPointer) -> Data in
            guard let bytes = rawBytesPointer.baseAddress?.assumingMemoryBound(to: Float.self) else {
                return Data()
            }
            let hashMethod: CBridgeCryptoMethodType
            let digestLength: Int
            switch hashType {
            case .md5:
                hashMethod = CC_MD5
                digestLength = Int(CC_MD5_DIGEST_LENGTH)
            case .sha1:
                hashMethod = CC_SHA1
                digestLength = Int(CC_SHA1_DIGEST_LENGTH)
            case .sha224:
                hashMethod = CC_SHA224
                digestLength = Int(CC_SHA224_DIGEST_LENGTH)
            case .sha256:
                hashMethod = CC_SHA256
                digestLength = Int(CC_SHA256_DIGEST_LENGTH)
            case .sha384:
                hashMethod = CC_SHA384
                digestLength = Int(CC_SHA384_DIGEST_LENGTH)
            case .sha512:
                hashMethod = CC_SHA512
                digestLength = Int(CC_SHA512_DIGEST_LENGTH)
            }
            let result = UnsafeMutablePointer<UInt8>.allocate(capacity: digestLength)
            _ = hashMethod(bytes, CC_LONG(count), result)
            let md5Data = Data(bytes: result, count: digestLength)
            result.deallocate()
            return md5Data
        }
    }
}

উদাহরণ

let str = "The most secure string ever"
print("md5", str.data(using: .utf8)?.md5.hexString)
print("sha1", str.data(using: .utf8)?.sha1.hexString)
print("sha224", str.data(using: .utf8)?.sha224.hexString)
print("sha256", str.data(using: .utf8)?.sha256.hexString)
print("sha384", str.data(using: .utf8)?.sha384.hexString)
print("sha512", str.data(using: .utf8)?.sha512.hexString)

ফলাফল:

এমডি 5 alচ্ছিক ("671C121427F12FBBA6666E71C44CB62C")

sha1 ptionচ্ছিক ("A6A40B223AE634CFC8C191DDE024BF0ACA56D7FA")

sha224 ptionচ্ছিক ("334370E82F2F5ECF5B2CA0910C6176D94CBA12FD6F518A7AB8D12ADE")

sha256 ptionচ্ছিক ("8CF5ED971D6EE2579B1BDEFD4921415AC03DA45B49B89665B3DF197287EFC89D")

sha384 ptionচ্ছিক ("04BB3551CBD60035BA7E0BAA141AEACE1EF5E17317A8FD108DA12A7A8E98C245E14F92CC1A241C732209EAC9D600602E")

sha512 ptionচ্ছিক ("1D595EAFEB2162672830885D336F75FD481548AC463BE16A8D98DB33637213F1AEB36FA4977B9C23A82A4FAB8A70C06AFC64C610D3CB1FE77A60ADC9EEEE"



0

আমার দুটি সেন্ট (যদি আপনার ডেটা / এনএসডাটার জন্য দ্রুত এমডি 5 প্রয়োজন হয় , উদাহরণস্বরূপ আপনি ডিস্ক বা নেটওয়াকর্কের জন্য বাইনারি ডাউনলোড করেছেন বা পড়েছেন)

(স্ট্রিং এক্সটেনশন হিসাবে "সুইফট 5 উত্তর থেকে ইনজেকটাস কোডির দুর্দান্ত উত্তরের ভিত্তিতে" নির্লজ্জ):

extension Data {
    var md5Value: String {
        let length = Int(CC_MD5_DIGEST_LENGTH)
        var digest = [UInt8](repeating: 0, count: length)

        _ = self.withUnsafeBytes { body -> String in
            CC_MD5(body.baseAddress, CC_LONG(self.count), &digest)
            return ""
        }


        return (0 ..< length).reduce("") {
            $0 + String(format: "%02x", digest[$1])
        }
    }
} 

পরীক্ষা:

print("test".data.md5Value) /*098f6bcd4621d373cade4e832627b4f6*/
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.