private static void OnHashesGenerated(BuildReport report, BuildHashes[] hashedBuilds) { Debug.Log("CodeHashGeneratorListener example listener saying hello."); var whitelistedHashes = string.Empty; // Upload hashes to the server or do anything you would like to. // // Note, you may have multiple builds each with own hashes in some cases after build, // e.g. when using "Split APKs by target architecture" option. foreach (var hashedBuild in hashedBuilds) { hashedBuild.PrintToConsole(); whitelistedHashes += hashedBuild.SummaryHash + GenuineValidatorExample.Separator; var fileHashes = hashedBuild.FileHashes; var fileHashesLength = fileHashes.Length; for (var i = 0; i < fileHashesLength; i++) { var fileHash = fileHashes[i]; whitelistedHashes += fileHash.Hash; if (i != fileHashesLength - 1) { whitelistedHashes += GenuineValidatorExample.Separator; } } } // for example, you may put hashes next to the standalone build to compare them offline // just as a proof of concept, but please consider uploading your hashes to the server // and make comparison on the server-side instead when possible to add cheaters some more pain var outputFolder = Path.GetDirectoryName(report.summary.outputPath); if (string.IsNullOrEmpty(outputFolder) || !Directory.Exists(outputFolder)) { Debug.LogError(ACTkConstants.LogPrefix + "Couldn't find build folder!"); return; } var filePath = Path.Combine(outputFolder, GenuineValidatorExample.FileName); // encrypt to hide hashes from the eye var encryptedValue = ObscuredString.Encrypt(whitelistedHashes, GenuineValidatorExample.StringKey); // now just get raw bytes and write them to the file to compare hashes in runtime var bytes = GenuineValidatorExample.UnicodeCharsToBytes(encryptedValue); File.WriteAllBytes(filePath, bytes); }
private static void OnHashesGenerate(BuildReport report, Dictionary <string, string> buildHashes) { Debug.Log("CodeHashGeneratorListener example listener saying hello."); // Upload hashes to the server or do anything you would like to. // // Note, you may have multiple builds each with own hash in some cases after build, // e.g. when using "Split APKs by target architecture" option. foreach (var buildHash in buildHashes) { Debug.Log("Build: " + buildHash.Key + "\n" + "Hash: " + buildHash.Value); } // for example, you may put hash next to the standalone build to compare it offline // just as a proof of concept, please consider uploading your hash to the server // and make comparison on the server-side to add some more pain to the cheaters\ var firstBuildHash = buildHashes.FirstOrDefault().Value; if (string.IsNullOrEmpty(firstBuildHash)) { Debug.LogError(ACTkConstants.LogPrefix + "Couldn't find first build hash!"); return; } var outputFolder = Path.GetDirectoryName(report.summary.outputPath); if (string.IsNullOrEmpty(outputFolder) || !Directory.Exists(outputFolder)) { Debug.LogError(ACTkConstants.LogPrefix + "Couldn't find build folder!"); return; } var filePath = Path.Combine(outputFolder, GenuineValidatorExample.FileName); var hashOfTheHashHaha = GenuineValidatorExample.GetHash(firstBuildHash + GenuineValidatorExample.HashSalt); // let's put together build hash with its hash and encrypt it using constant key var encryptedValue = ObscuredString.Encrypt(firstBuildHash + GenuineValidatorExample.Separator + hashOfTheHashHaha, GenuineValidatorExample.StringKey); // now just get raw bytes and write them to the file to compare hash in runtime var bytes = GenuineValidatorExample.UnicodeCharsToBytes(encryptedValue); File.WriteAllBytes(filePath, bytes); }