Эквивалент MD5 от CryptoJS и Python Hashlib - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь перенести код из JS в Python.Я застрял с этим кодом в JS:

const crypto = require('crypto')

var txtToHash = "Hello¤World¤";
var md5sum = crypto.createHash('md5');
md5sum.update(new Buffer(txtToHash, 'binary'));
md5val = md5sum.digest('hex');
// equivalent to
// crypto.createHash('md5').update(urlPart, 'binary').digest('hex'));

Возвращает: 3a091f847ee21c7c1927c19e0f29a28b

И в Python 3.7 у меня есть этот код:

import hashlib

txtToHash = "Hello¤World¤"
md5val = hashlib.md5(txtToHash.encode()).hexdigest() 

Возвращает: f0aef2e2e25ddf71473aa148b191dd70

Почему они разные, пожалуйста?Я не могу найти ответ в Google или SO.

1 Ответ

0 голосов
/ 24 сентября 2018

при создании дайджеста вы используете две разные кодировки символов.

Убедитесь, что у вас одинаковый тип кодировки символов.Реализация вашего узла js использует кодировку 'двоичный' псевдоним 'latin1'.Где в качестве кода в python используется кодировка символов UTf8.

Когда вы указали txtToHash.encode (), это означает, что кодирует текст в utf-8.

Поэтому измените создание дайджеста, чтобы оно соответствовалокодировка символов одинакова в обеих средах.

либо измените свой код nodejs

md5sum.update(new Buffer(txtToHash, 'utf8'));

, либо измените свой код Python на

md5val = hashlib.md5(txtToHash.encode('latin1')).hexdigest()

, приведенное выше должно датьтот же результат >> 3a091f847ee21c7c1927c19e0f29a28b

Примечание: хотя код Python дает желаемый результат.Я бы не советовал, потому что кодировка latin1 имеет только небольшое подмножество символов по сравнению с utf8.Поэтому я рекомендую вам изменить кодировку на utf-8 в вашем приложении js node и применить ту же кодировку в python *

...