[解決済み] iOSでSwiftを使ってStringをMD5ハッシュに変換するにはどうすればいいですか?
質問
abc"のような文字列をMD5ハッシュに変換したいです。私はこれをiOSとSwiftで行いたいと思います。私は以下の解決策を使用しようとしましたが、彼らは私のために働いていませんでした。
SwiftフレームワークでCommonCryptoをインポートする
http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/
より明確にするために、私はSwiftでこのPHPコードの出力と同様の出力を達成したいです。
$str = "Hello";
echo md5($str);
出力します。8b1a9953c4611296a827abf8c47804d7
どのように解決するのですか?
2つのステップがあります。
1. 文字列からmd5データを作成する
2. md5データを16進文字列に変換する
Swift 2.0です。
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)")
出力します。
をダイジェストで表示します。8b1a9953c4611296a827abf8c47804d7
Swift 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==
Swift 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>
は、Bridging-Header ファイルに追加する必要があります。
Bridging-Headerの作成方法については このSOの答え .
一般的に、MD5は新しい作品に使用すべきではありません。SHA256が現在のベストプラクティスです。
非推奨のドキュメントセクションからの例です。
MD2、MD4、MD5、SHA1、SHA224、SHA256、SHA384、SHA512 (Swift 3 以上)
<ブロッククオートこれらの関数は、8つの暗号ハッシュアルゴリズムのうちの1つで、StringまたはDataの入力をハッシュ化します。
nameパラメータは、ハッシュ関数の名前を文字列で指定します。
サポートされている関数は、MD2、MD4、MD5、SHA1、SHA224、SHA256、SHA384、SHA512です。
a
この例では、Common Cryptoが必要です。
プロジェクトにブリッジングヘッダーが必要です。
#import <CommonCrypto/CommonCrypto.h>
プロジェクトにSecurity.frameworkを追加します。
この関数は、ハッシュ名とハッシュ化するStringを受け取り、Dataを返します。
name: ハッシュ関数名(String) 文字列 ハッシュ化される文字列 returns: データとしてハッシュ化された結果
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>
関連
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] JavaでMD5ハッシュを生成するにはどうすればよいですか?
-
[解決済み] iOSのステータスバーの文字色を変更する方法
-
[解決済み] SwiftでStringを配列に分割する?
-
[解決済み] SwiftでIntをStringに変換する
-
[解決済み] インポート vs #インポート - iOS 7
-
[解決済み] Swiftのプロトコルでオプションのメソッドを定義するには?
-
[解決済み] ファイルはユニバーサル(3スライス)ですが、iOSの静的ライブラリのための(n)ARMv7-sスライスエラーが含まれていない、どうにかして回避するには?
-
[解決済み】iOSアプリの名前を変更する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] iPhone UITextField - プレースホルダーの文字色を変更する
-
[解決済み] UITextViewのマージン/パディングをなくす方法
-
[解決済み] テキストフィールドを移動する方法(次へボタン/完了ボタン)
-
[解決済み] iOSとWatchKitで画像のtintColorを変更する方法
-
[解決済み] SwiftフレームワークでCommonCryptoをインポートする