Имя: Пароль:
1C
1С v8
Хеширование 256 в 1с
0 Лентаf
 
01.04.22
15:23
Привет.
Делаю хеш в 1с

    Хедж = Новый ХешированиеДанных(ХешФункция.SHA256);
    Хедж.Добавить("helloworld");
    Сообщить(Хедж.ХешСумма);

получаю 93 6A 18 5C AA A2 66 BB 9C BE 98 1E 9E 05 CB 78 CD 73 2B 0B 32 80 EB 94 44 12 BB 6F 8F 8F 07 AF

на линухе:

[root@localhost ~]# echo helloworld | shasum -a 256
8cd07f3a5ff98f2a78cfc366c13fb123eb8d29c1ca37c79df190425d5b9e424d  

почему есть отличие?

Usage: shasum [OPTION]... [FILE]... Print or check SHA checksums. With no FILE, or when FILE is -, read standard input. -a, --algorithm 1 (default), 224, 256, 384, 512, 512224, 512256 -b, --binary read in binary mode -c, --check read SHA sums from the FILEs and check them -t, --text read in text mode (default) -p, --portable read in portable mode produces same digest on Windows/Unix/Mac -0, --01 read in BITS mode ASCII '0' interpreted as 0-bit, ASCII '1' interpreted as 1-bit, all other characters ignored The following two options are useful only when verifying checksums: -s, --status don't output anything, status code shows success -w, --warn warn about improperly formatted checksum lines -h, --help display this help and exit -v, --version output version information and exit When verifying SHA-512/224 or SHA-512/256 checksums, indicate the algorithm explicitly using the -a option, e.g. shasum -a 512224 -c checksumfile The sums are computed as described in FIPS PUB 180-4. When checking, the input should be a former output of this program. The default mode is to print a line with checksum, a character indicating type (`*' for binary, ` ' for text, `?' for portable, `^' for BITS), and name for each FILE.

Read more at: https://www.commandlinux.com/man-page/man1/shasum.1.html
1 H A D G E H O G s
 
01.04.22
15:24
Какая кодировка у строки в линухе?
2 Beduin
 
01.04.22
15:26
В линухе врет похоже
https://crypt-online.ru/crypts/sha256/
3 Лентаf
 
01.04.22
15:27
(1) такая же как и в 1с
4 Лентаf
 
01.04.22
15:27
(2) не уверен. https://crypt-online.ru/crypts/sha256/

дает 8cd07f3a5ff98f2a78cfc366c13fb123eb8d29c1ca37c79df190425d5b9e424d
5 Chai Nic
 
01.04.22
15:28
В линуксе

echo helloworld | sha256sum
8cd07f3a5ff98f2a78cfc366c13fb123eb8d29c1ca37c79df190425d5b9e424d  -

А shasum -a 256 выдает другое. Очевидно, проблема в утилите shasum, которая работает как-то иначе. Может она перевод строки воспринимает как значащий символ?
6 Beduin
 
01.04.22
15:30
(4) А как у тебя получилось 8cd07f3a5ff98f2a78cfc366c13fb123eb8d29c1ca37c79df190425d5b9e424d. На какое слово?
7 Chai Nic
 
01.04.22
15:30
Да, точно. Надо shasum с ключом -b запускать, в бинарном режиме
echo helloworld | shasum -a 256 -b
8cd07f3a5ff98f2a78cfc366c13fb123eb8d29c1ca37c79df190425d5b9e424d *-
8 Лентаf
 
01.04.22
15:31
вот спецификации на функцию https://www.commandlinux.com/man-page/man1/shasum.1.html
9 Лентаf
 
01.04.22
15:32
(6) сайт дает 936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af как и 1с
10 H A D G E H O G s
 
01.04.22
15:33
(9) Добавь ентер в строку в сайте в конце и получишь

8cd07f3a5ff98f2a78cfc366c13fb123eb8d29c1ca37c79df190425d5b9e424d
11 H A D G E H O G s
 
01.04.22
15:34
12 Лентаf
 
01.04.22
15:35
(7) [root@localhost ~]# echo helloworld | shasum -a 256 -b
8cd07f3a5ff98f2a78cfc366c13fb123eb8d29c1ca37c79df190425d5b9e424d *-
13 Chai Nic
 
01.04.22
15:37
(12)
# echo -n helloworld | shasum -a 256
936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af  -
14 H A D G E H O G s
 
01.04.22
15:38
(12) https://prnt.sc/snt5FVbK_O9I

Твой Линух добавляет перенос строки к helloworld
15 H A D G E H O G s
 
01.04.22
15:39
бисово отродье.
16 Chai Nic
 
01.04.22
15:40
(15) Такое поведение команды echo без ключа -n
17 Лентаf
 
01.04.22
15:42
(16) [root@localhost ~]# echo -n helloworld | shasum -a 256
936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af  -
18 Лентаf
 
01.04.22
15:43
да вставил в линь -n и они сравнялись...
19 H A D G E H O G s
 
01.04.22
15:45
Lumen Celum!
20 Лентаf
 
01.04.22
15:51
[root@localhost ~]# echo 101010 | shasum -a 256
d8c6598a1f94a07a1a049852c1c2e3145cc2d746471a570bec3a69d4eae24462  -
[root@localhost ~]# echo 101010 | shasum -a 256 -0
a1da398c3a31a5113f9872ec17fcfc32e4084d476548c9a2d5b4e02ff5bdd47f ^-
[root@localhost ~]# echo -n  101010 | shasum -a 256 -0
a1da398c3a31a5113f9872ec17fcfc32e4084d476548c9a2d5b4e02ff5bdd47f ^-
[root@localhost ~]# echo -n  101010 | shasum -a 256
2a057642222a878bc360f52f8e1f0dfd2af93196f123269397423155a4ec4884  -

интересно а добавить в 1с битовый режим можно?

-0, --01 read in BITS mode ASCII '0' interpreted as 0-bit, ASCII '1' interpreted as 1-bit, all other characters ignored
21 Лентаf
 
01.04.22
15:53
1с на это Хедж.ХешСумма    2A 05 76 42 22 2A 87 8B C3 60 F5 2F 8E 1F 0D FD 2A F9 31 96 F1 23 26 93 97 42 31 55 A4 EC 48 84    ДвоичныеДанные
22 H A D G E H O G s
 
01.04.22
15:58
(20) (21) Непонятно, что ты хочешь
23 Лентаf
 
01.04.22
16:04
у функции shasum есть параметр -0 который позволяет воспринимать значение в битовой форме,
почитай https://www.linux.org/docs/man1/shasum.html
такое же надо и в 1с.
24 Лентаf
 
01.04.22
16:06
-0, --01          read in BITS mode
                                ASCII '0' interpreted as 0-bit,
                                ASCII '1' interpreted as 1-bit,
                                all other characters ignored
25 H A D G E H O G s
 
01.04.22
16:14
(23) Такого же в 1С нету.
Формат шлепанутый, кстати. Почему бы не Base16, к примеру?
26 ДенисЧ
 
01.04.22
16:15
(19) Валар моргулис!
27 Лентаf
 
01.04.22
16:19
[root@localhost ~]# echo 101010 | shasum -a 256
d8c6598a1f94a07a1a049852c1c2e3145cc2d746471a570bec3a69d4eae24462  -
[root@localhost ~]# echo 101010 | shasum -a 256 -0
a1da398c3a31a5113f9872ec17fcfc32e4084d476548c9a2d5b4e02ff5bdd47f ^-

разные вещи
28 H A D G E H O G s
 
01.04.22
16:24
(27) Естественно.
29 Лентаf
 
01.04.22
16:26
(25) а жаль, надо написать в 1с.
30 H A D G E H O G s
 
01.04.22
16:35
(29) Написать в фирму 1С, чтобы сделали?
31 Chai Nic
 
01.04.22
16:47
Битовые операции в 1с производятся только в составе байта. Можно таким образом получит байт из этих бит, но он будет дополнен нулями до 8 разрядов. Соответственно, хэш битовой маски получить можно только если она кратна 8 битам.
Как-то так

    ДвоичнаяСтрока="101010";
    Поток = новый ПотокВПамяти();
    Запись = новый ЗаписьДанных(Поток,КодировкаТекста.UTF8);
    Запись.ЗаписатьБайт(ЧислоИзДвоичнойСтроки("0b"+ДвоичнаяСтрока));
    Запись.Закрыть(); //не забываем чистить за собой    
    ДД = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    
    Хэш=Новый ХешированиеДанных(ХешФункция.SHA256);
    Хэш.Добавить(ДД);
    Сообщить(Хэш.ХешСумма);

68 48 88 C0 EB B1 7F 37 42 98 B6 5E E2 80 75 26 C0 66 09 4C 70 1B CC 7E BB E1 C1 09 5F 49 4F C1

Если сравнить с линуксом

# echo 101010 | shasum -a 256 -0
a1da398c3a31a5113f9872ec17fcfc32e4084d476548c9a2d5b4e02ff5bdd47f ^-

# echo 00101010 | shasum -a 256 -0
684888c0ebb17f374298b65ee2807526c066094c701bcc7ebbe1c1095f494fc1 ^-
32 ДедМорроз
 
01.04.22
20:29
В 1с строки в utf-16,а в linux,как и положено - в utf-8.
Так что перевести строку в двоичные данные,выбрав utf-8 кодировку и получить результат,как и везде.
33 ДедМорроз
 
01.04.22
20:32
В 1с нет понятия бит,а есть только понятие байт для двоичных данных.
Собственно говоря,очень мало языков программирования,где можно оперировать последовательностью бит независимо от их представления в памяти.
34 Лентаf
 
01.04.22
21:05
(31) мое уважение, будем пробовать.
35 Лентаf
 
04.04.22
07:37
(31) тут можно брать двоичное число до 256, а если надо больше?
(32) Как это реализовать? В примере (31)?
36 Chai Nic
 
04.04.22
07:39
(35) тут можно брать двоичное число до 256, а если надо больше?
Формируй значит два байта, 4 и так далее.
37 zinzillya
 
04.04.22
08:30
(0) это вообще для чего? (чистое любопытство)
38 Лентаf
 
08.06.22
21:28
(36) это как, два байта?
39 ДедМорроз
 
08.06.22
22:54
Если мы умеем записывать байт в поток (через буфер единичной длины),то можно коды символов согласно правилам utf-8 перевести в один,два или три байта.
А потом уже полученную последовптельность хэшировать.
40 Лентаf
 
09.06.22
15:47
(25) в итоге двоичный код перевел в 16 ричный а тут уже 1с нормально хеширует, так и получилось.