我如何计算摘要
How can I calculate a digest
我想与银行建立联系,正如我在 cardlink 的文档中看到的那样,他们想计算摘要。
这次计算的主要思想是这样的
Digest=base64( sha-1( utf8bytes(value1|value2|...|secret) ) )
.
MessageDigestmdigest = MessageDigest.getInstance("SHA-1");
byte[] digestResult =digest.digest(concatString.getBytes("UTF-8"));
String calculatedDigest = Base64.encode(digestResult);
这是他们为 java 提供的代码。
我开始手动测试这个,但我坚持字节转换。
this is the finall step for base64
所以我的主要问题是如何转换为字节,如果有人知道用 swift (ios) 进行转换的方法是否会有很大帮助。
提前致谢
编辑
这是我得到的示例字符串:
2.045020311114033331503343429780020454510MDAwMDAwMDAwMDAwMDA2ODkzOTI=https://myeshop.gr/orders/Payment_Okhttps://myeshop.gr/orders/Payment_FailEURO123
这就是我想要的结果:
wXRSbgCX2Kq6gSOVE6+c9VpvSRQ=
这是你需要的吗?
import UIKit
extension String {
func sha1() -> String {
let data = self.dataUsingEncoding(NSUTF8StringEncoding)!
var digest = [UInt8](count:Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA1(data.bytes, CC_LONG(data.length), &digest)
let hexBytes = digest.map { String(format: "%02hhx", [=10=]) }
return hexBytes.joinWithSeparator("")
}
func sha1Data() -> NSData {
let data = self.dataUsingEncoding(NSUTF8StringEncoding)!
var digest = [UInt8](count:Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA1(data.bytes, CC_LONG(data.length), &digest)
let digestData = NSData(bytes: digest, length: digest.count)
return digestData
}
}
class TestSHA1Digest: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let b64 = calculateDigest("2.045020311114033331503343429780020454510MDAwMDAwMDAwMDAwMDA2ODkzOTI=https://myeshop.gr/orders/Payment_Okhttps://myeshop.gr/orders/Payment_FailEURO123") {
print("SHA1: \(b64)")
} else {
print("Calcuate SHA1 failed")
}
}
func calculateDigest(data: String) -> String? {
let shaData = data.sha1Data()
return shaData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
}
}
[输出] SHA1: wXRSbgCX2Kq6gSOVE6+c9VpvSRQ=
PS。我正在使用 swift 2 + Xcode 7.3.1。如果您正在使用 swift,请告诉我 3.
我想与银行建立联系,正如我在 cardlink 的文档中看到的那样,他们想计算摘要。
这次计算的主要思想是这样的
Digest=base64( sha-1( utf8bytes(value1|value2|...|secret) ) )
.
MessageDigestmdigest = MessageDigest.getInstance("SHA-1");
byte[] digestResult =digest.digest(concatString.getBytes("UTF-8"));
String calculatedDigest = Base64.encode(digestResult);
这是他们为 java 提供的代码。
我开始手动测试这个,但我坚持字节转换。
this is the finall step for base64
所以我的主要问题是如何转换为字节,如果有人知道用 swift (ios) 进行转换的方法是否会有很大帮助。
提前致谢
编辑
这是我得到的示例字符串:
2.045020311114033331503343429780020454510MDAwMDAwMDAwMDAwMDA2ODkzOTI=https://myeshop.gr/orders/Payment_Okhttps://myeshop.gr/orders/Payment_FailEURO123
这就是我想要的结果:
wXRSbgCX2Kq6gSOVE6+c9VpvSRQ=
这是你需要的吗?
import UIKit
extension String {
func sha1() -> String {
let data = self.dataUsingEncoding(NSUTF8StringEncoding)!
var digest = [UInt8](count:Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA1(data.bytes, CC_LONG(data.length), &digest)
let hexBytes = digest.map { String(format: "%02hhx", [=10=]) }
return hexBytes.joinWithSeparator("")
}
func sha1Data() -> NSData {
let data = self.dataUsingEncoding(NSUTF8StringEncoding)!
var digest = [UInt8](count:Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA1(data.bytes, CC_LONG(data.length), &digest)
let digestData = NSData(bytes: digest, length: digest.count)
return digestData
}
}
class TestSHA1Digest: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let b64 = calculateDigest("2.045020311114033331503343429780020454510MDAwMDAwMDAwMDAwMDA2ODkzOTI=https://myeshop.gr/orders/Payment_Okhttps://myeshop.gr/orders/Payment_FailEURO123") {
print("SHA1: \(b64)")
} else {
print("Calcuate SHA1 failed")
}
}
func calculateDigest(data: String) -> String? {
let shaData = data.sha1Data()
return shaData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
}
}
[输出] SHA1: wXRSbgCX2Kq6gSOVE6+c9VpvSRQ=
PS。我正在使用 swift 2 + Xcode 7.3.1。如果您正在使用 swift,请告诉我 3.