具有md5 / sha1哈希命令的简单编程语言?

3
我想创建一个简单的暴力破解密码程序,该程序将从stdin读取输入并将其哈希后与现有哈希进行比较(用于我的安全课程)。
我之前没有进行过涉及哈希的实际编程,因为到目前为止它主要是概念/数学部分。 有没有一种相对容易学习且具有简单哈希命令的语言? 我的一个朋友推荐了Python,但我不确定是否还有其他可在一两天内掌握的语言。我了解一些C语言,但哈希似乎相对复杂,需要额外的库。
此外,任何关于实际哈希命令的语法帮助都将受到赞赏。该程序本身需要能够支持奇怪的哈希方法,例如对值进行两次哈希或使用不改变的固定盐,并且能够从stdin接收输入(以便与类似johntheripper的程序一起使用)。

1
在PHP中,您只需编写 sha1($password)md5($password)。它非常容易学习和使用。 - john_science
5个回答

12

假设您只需要使用哈希函数,而不是自己实现哈希函数,Python的hashlib模块提供了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

我认为Python在这种情况下是一个不错的选择。它有 hashlib模块 可以开始使用,如果需要更多的功能, PyCrypto工具包 很容易使用,支持很多密码原语,包括哈希。如果你已经了解一些C语言,那么只使用带有openssl库的C语言可能更容易上手。无论如何,通常值得投入时间来学习所选语言的加密库(特别是在加密课程中),因为最终你将想要使用一些你不想手写代码并确信它正确实现的内容。

至于实际哈希命令的语法,在这里是一个用Python 3.2和PyCrypto获取SHA256哈希的示例:

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

1

Python 中的 hashlib 库包含以下内容:

'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

0

这个小的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

-1

任何值得学习的编程语言都不可能在几天内掌握。你可能能够理解语法,但除此之外就没有什么了。我喜欢这篇文章: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));
}

2
我完全不同意。你可以在不到一天的时间里学会Python - 当然,你不会知道所有细节,但是基本知识和足够完成这个任务?绝对没问题。 - Gareth Latty
2
任何值得一试的编程语言(这是双关语吗?)如果你已经理解了编程原则,那么只需要几分钟就可以学会。语言就是语法。是的,每种语言都有其文化方法,但任何程序员都可以在不真正理解其文化的情况下大量使用一种语言(例如我现在正在使用的相当不符合Python风格但完全功能正常的avro API)。(学习编程是另一回事,学习一种语言只是其中的一小部分。) - kojiro
我知道学习任何编程语言的基础操作并不难。但你很难在一天内掌握有用的东西。根据我的经验,一个编程语言最重要的部分是其可用的库。此外,不同编程语言之间还存在许多微妙的差别,这可能会让粗心大意的人犯错。因此,一个编程语言远远不止于语法。 - Kendall Frey
1
你为什么会向那些明确表示需要快速掌握语言的人推荐一种具有许多棘手语法的语言呢? - Marcin
@KendallFrey 我认为可以公平地说,任何具有类型变量和实质上语法冗余的语言的句法细节都比避免这些内容的语言更难学习。这甚至不是学习编程的好语言的问题 - OP也希望能够快速掌握它。如果您认为C#不能在一天内学会,而且您喜欢它,而Python用户建议基础知识可以在一天内学会,那么这是一个相当有说服力的论据。(当然,并不像实际研究那样有说服力)。 - Marcin
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接