I been working on this for days.

Our backend have a signature checking which is done using PHP:

private $HMAC_ALGO = 'md5';

public function decodeAndValidateMessage($data,$signature,$secretkey) {

if (!is_string($data)) {

throw new InvalidRequestException($data);

}

$decodedData = base64_decode($data);

// if not json returned the throw exception...

$jsonDecoded = json_decode($decodedData,true);

if (!$jsonDecoded) {

throw new InvalidRequestException($decodedData);

}

// validate

$signatureRef = base64_encode(hash_hmac($this->HMAC_ALGO,$decodedData,$secretkey,true));

if ($signature === $signatureRef) {

return $jsonDecoded;

} else {

throw new InvalidSignatureException();

}

}

I made it work on iOS:

func hmac(_ algorithm: HMACAlgorithm, key: String) -> String {

let cKey = key.cString(using: String.Encoding.utf8)

let cData = self.cString(using: String.Encoding.utf8)

var result = [CUnsignedChar](repeating: 0, count: Int(algorithm.digestLength()))

CCHmac(algorithm.toCCHmacAlgorithm(), cKey!, Int(strlen(cKey!)), cData!, Int(strlen(cData!)), &result)

let hmacData:Data = Data(bytes: UnsafePointer(result), count: (Int(algorithm.digestLength())))

let hmacBase64 = hmacData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))

print(String(hmacBase64))

return String(hmacBase64)

}

Any idea/help on doing this on Kotlin/Android? I'm being stuck on InvalidSignatureException error.

fun generateSignature(data : HashMap) : String {

val hmac = Mac.getInstance("HmacMD5")

hmac.init(SecretKeySpec(Constant.PRIVATEKEY.toByteArray(Charsets.UTF_8), hmac.algorithm))

return Base64.encodeToString(data.toString().toByteArray(),Base64.URL_SAFE + Base64.NO_PADDING + Base64.NO_CLOSE + Base64.NO_WRAP)

}

Thanks :D I really appreciate for any help :D

Update:

Just to make my question simpler?

Is it possible to make translate the iOS line of code to Kotlin?

enum HMACAlgorithm {

case md5, sha1, sha224, sha256, sha384, sha512

func toCCHmacAlgorithm() -> CCHmacAlgorithm {

var result: Int = 0

switch self {

case .md5:

result = kCCHmacAlgMD5

case .sha1:

result = kCCHmacAlgSHA1

case .sha224:

result = kCCHmacAlgSHA224

case .sha256:

result = kCCHmacAlgSHA256

case .sha384:

result = kCCHmacAlgSHA384

case .sha512:

result = kCCHmacAlgSHA512

}

return CCHmacAlgorithm(result)

}

func digestLength() -> Int {

var result: CInt = 0

switch self {

case .md5:

result = CC_MD5_DIGEST_LENGTH

case .sha1:

result = CC_SHA1_DIGEST_LENGTH

case .sha224:

result = CC_SHA224_DIGEST_LENGTH

case .sha256:

result = CC_SHA256_DIGEST_LENGTH

case .sha384:

result = CC_SHA384_DIGEST_LENGTH

case .sha512:

result = CC_SHA512_DIGEST_LENGTH

}

return Int(result)

}

}

this is how I call the function

var params : Dictionary

params.generateSignature()

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐