Необходимо проверить значение хеша для ответа 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
Получение разных значений SHA-224 в Python и Kotlin Android ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1730183527
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)
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79136054/getting-different-sha-224-values-in-python-and-kotlin-android[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия