16

そのため、Objective-C で Sha256 パスワードを生成する必要がありますが、その方法が一生わからないのです! 私が見逃している簡単なものはありますか?

次のメソッドを実装してみました (これは iPhone 用に作成されたものですが、一部の Objective-C コードと同様に、クロスプラットフォームで動作する可能性があると考えました)。

-(NSString*)sha256HashFor:(NSString*)input
{
    const char* str = [input UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(str, strlen(str), result);

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
    {
        [ret appendFormat:@"%02x",result[i]];
    }
    return ret;
}

しかし、それは CC_SHA256_DIGEST_LENGTH が宣言されていない識別子であるというエラーを吐き出すだけです。

4

5 に答える 5

23

適切なヘッダー ファイルを含める必要があります。

#include <CommonCrypto/CommonDigest.h>

Cryptographic Servicesのドキュメントによると、これは iOS と OS X の両方で利用できるはずです。

OS X v10.5 以降および iOS 5.0 以降では、Common Crypto は暗号化と復号化のための低レベル C サポートを提供します。Common Crypto は Security Transforms ほど単純ではありませんが、追加のハッシュ スキームや暗号モードなど、より幅広い機能を提供します。

于 2013-05-31T21:26:19.590 に答える
11
#import <CommonCrypto/CommonDigest.h>

Objective-C: SHA256 は次の 2 行のみです。

+ (NSData *)doSha256:(NSData *)dataIn {
    NSMutableData *macOut = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(dataIn.bytes, dataIn.length, macOut.mutableBytes);
    return macOut;
}

スイフト3

func sha256Hex(string: String) -> String? {
    guard let messageData = string.data(using:String.Encoding.utf8) else { return nil }
    var digestData = Data(count: Int(CC_SHA256_DIGEST_LENGTH))

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

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

// テスト

let sha256HexString = sha256Hex(string:"Hello")
print("sha256HexString: \(sha256HexString!)")

sha256HexString: "185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969"

于 2014-09-11T00:09:53.743 に答える