Простой язык программирования с хэш-командой md5 / sha1? - PullRequest
3 голосов
/ 01 апреля 2012

Я хочу создать простой взломщик паролей, который будет хэшировать входные данные из stdin и сравнивать результат с существующим хешем (для моего класса ценных бумаг).

Я никогда не занимался программированием с использованием хэшей, поскольку до сих пор это были в основном концептуальные / математические части. Есть ли (относительно) простой для изучения язык с простой хэш-командой? Мой друг рекомендовал Python, но я не уверен, что есть что-то еще, что я мог бы подобрать в течение дня или два Я немного знаю C, но хэширование кажется относительно сложным и требует дополнительных библиотек.

Также приветствуется любая синтаксическая справка по фактической хэш-команде. Сама программа должна иметь возможность поддерживать нечетные методы хеширования, такие как двойное хеширование значения или использование неизменяемой соли набора, и иметь возможность принимать входные данные из stdin (для использования с такими программами, как johntheripper).

Ответы [ 5 ]

12 голосов
/ 01 апреля 2012

Предполагая, что вас просят использовать хеш-функции, а не реализовывать хеш-код самостоятельно, В хэш-модуле Python есть подпрограммы для md5 и sha1:

[Обновлено для Python 3, в котором hashlib нужны байты, а не строки:]

>>> import hashlib
>>> s = 'something to hash'
>>> sb = s.encode("utf8")
>>> hashlib.md5(sb)
<md5 HASH object @ 0x7f36f5ce3440>
>>> hashlib.md5(sb).hexdigest()
'6f4815fdf1f1fd3f36ac295bf39d26b4'
>>> hashlib.sha1(sb).hexdigest()
'72668bc961b0a78bfa1633f6141bcea69ca37468'

[Старая версия Python 2:]

>>> import hashlib
>>> s = 'something to hash'
>>> hashlib.md5(s)
<md5 HASH object @ 0xb7714ca0>
>>> hashlib.md5(s).hexdigest()
'6f4815fdf1f1fd3f36ac295bf39d26b4'
>>> hashlib.sha1(s).hexdigest()
'72668bc961b0a78bfa1633f6141bcea69ca37468'
2 голосов
/ 01 апреля 2012

Библиотека hashlib в python содержит следующее:

'md5', 'new', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'

для проверки деталей: http://docs.python.org/release/3.1.3/library/hashlib.html

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
>>> m.digest_size
16
>>> m.block_size
64
2 голосов
/ 01 апреля 2012

Я думаю, что Python - хороший выбор для чего-то подобного. Для начала он имеет модуль hashlib , а если вам нужно больше энергии, набор инструментов PyCrypto прост в использовании и поддерживает множество криптографических примитивов, включая хеширование. Если вы уже знаете какой-то C, то, возможно, вам будет проще подобрать его с библиотеками openssl . В любом случае, обычно стоит потратить деньги на изучение крипто-библиотеки для вашего предпочтительного языка (особенно для крипто-класса), потому что в конечном итоге вы захотите использовать что-то, что не захотите писать вручную, и будьте уверены, что это реализован правильно.

Что касается синтаксиса с действительной командой хеширования, вот пример на python с PyCrypto для получения хеша SHA256 (с использованием python 3.2):

import Crypto.Hash.SHA256

to_hash = "hello, how are you?"
sha256 = Crypto.Hash.SHA256.new()
sha256.update(to_hash.encode())
dgst = sha256.hexdigest()
print(dgst)

производит вывод

5c1940d2a11cd8b1e256ea4183ba22cddfa7cc0d00610a159bd7f5886d01067a
0 голосов
/ 22 января 2013

Эта небольшая программа на Python лучше всего подходит для таких небольших задач

hash.py

import hashlib
import sys
try:
    hash_name = sys.argv[1]
except IndexError:
    print 'Specify the hash name as the first argument.'
else:
    try:
        data = sys.argv[2]
    except IndexError:
        print 'Please enter the data to be hashed'
        sys.exit()
    h = hashlib.new(hash_name)
    h.update(data)
    print h.hexdigest()

Вывод

$ python hash.py sha1 password1
e38ad214943daad1d64c102faec29de4afe9da3d
$ python hash.py sha256 password1
0b14d501a594442a01c6859541bcb3e8164d183d32937b851835442f69d5c94e
$ python hash.py md5 password1
7c6a180b36896a0a8c02787eeafb0e4c
0 голосов
/ 01 апреля 2012

За несколько дней выучить ни один из языков программирования не стоит. Вы можете понять синтаксис, но не намного дальше. Мне нравится эта статья: http://norvig.com/21-days.html

Вероятно, не самый лучший язык программирования для этого. Я могу порекомендовать C #, поскольку он имеет простые классы криптографии в System.Security.Cryptography.

Чтобы найти хэш MD5 байтового массива, вы можете использовать что-то вроде этого:

byte[] hash = System.Security.Cryptography.MD5.Create().ComputeHash(myByteArray);

Чтобы использовать SHA1, просто замените MD5 на SHA1.

Если вы хотите получить хэш строки ASCII, вы можете получить байтовый массив следующим образом:

byte[] myByteArray = System.Text.Encoding.ASCII.GetBytes(myString);

Пример функции для преобразования строки в хеш:

// At the top of the file:
// using System.Security.Cryptography;
// using System.Text;

byte[] GetHash(string message)
{
    return MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(message));
}
...