Получение разных значений SHA-224 в Python и Kotlin AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Получение разных значений SHA-224 в Python и Kotlin Android

Сообщение Anonymous »

Необходимо проверить значение хеша для ответа Json, полученного от серверной части. Хэш-значение правильно рассчитывается в Python и сопоставляется с правильным хеш-значением внутреннего сервера. где, поскольку я всегда получаю другое значение хеш-функции в Kotlin Android. поделитесь фрагментами кода ниже.
Python:
import json
import hashlib
import base64

msg = {
"name": "Alice",
"age": 25,
"address": {
"city": "Wonderland",
"street": "Rabbit Hole"
}
}

# Sort keys and ensure ASCII encoding
json_str = json.dumps(msg, ensure_ascii=False, sort_keys=True)
print(f"Serialized JSON (Python): {json_str}")

json_bin = json_str.encode('utf-8')

# Create SHA-224 hash and take first 16 bytes
hash_calculator = hashlib.sha224(json_bin)
hash_digest = hash_calculator.digest()[:16]

# Print hex digest
print(f"Hex digest (Python): {hash_digest.hex()}")

# Base64 encode
hash_encoded64 = base64.urlsafe_b64encode(hash_digest).decode('utf8')
print(f"Base64 encoded hash (Python): {hash_encoded64}")

Но когда я конвертирую тот же код Python в Kotlin и запускаю, я получаю другую ценность. Может ли кто-нибудь проверить это и сообщить мне, что происходит не так?
Kotlin:
fun calculateHas(){
// Original JSON message as a string
val msg = """
{
"name": "Alice",
"age": 25,
"address": {
"city": "Wonderland",
"street": "Rabbit Hole"
}
}
""".trim().trimIndent().replace("\n","")

// Parse the JSON string into a JSONObject
val jsonObj = JSONObject(msg)

// Serialize the JSONObject into a string with sorted keys
val sortedJsonObj = JSONObject()
val keys = jsonObj.keys().asSequence().toList().sorted()
for (key in keys) {
sortedJsonObj.put(key, jsonObj.get(key))
}
val sortedJsonStr = sortedJsonObj.toString().replace("\n","").toByteArray(StandardCharsets.UTF_8)

// Create a SHA-224 hash of the JSON byte array
val sha224Digest = MessageDigest.getInstance("SHA-224")
val hashBytes = sha224Digest.digest(sortedJsonStr)

// Get the first 16 bytes of the hash
val truncatedHash = hashBytes.sliceArray(0 until 16)

// Encode the truncated hash in Base64 (URL-safe, without padding)
val hashBase64 = Base64.encodeToString(truncatedHash, Base64.URL_SAFE or Base64.NO_WRAP)

// Print the Base64-encoded hash
println(hashBase64)
Log.e("Code:" , hashBase64)
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... in-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»