Python 使用md5/sha1散列命令的简单编程语言?

Python 使用md5/sha1散列命令的简单编程语言?,python,security,syntax,hash,programming-languages,Python,Security,Syntax,Hash,Programming Languages,我希望创建一个简单的暴力密码破解程序,它将散列来自stdin的输入,并将结果与现有散列(对于我的证券类)进行比较 不过,我从未做过任何涉及哈希的实际编程,因为到目前为止,它主要是概念/数学部分有没有一种(相对)简单易学的语言,它有一个简单的散列命令?我的一个朋友推荐了Python,但我不确定在一两天内我还能学到什么。我懂一点C语言,但哈希似乎比较复杂,需要额外的库 此外,如果有任何关于实际哈希命令的语法帮助,我们将不胜感激。程序本身需要能够支持奇数散列方法,比如将一个值散列两次或使用一个不变的集

我希望创建一个简单的暴力密码破解程序,它将散列来自stdin的输入,并将结果与现有散列(对于我的证券类)进行比较

不过,我从未做过任何涉及哈希的实际编程,因为到目前为止,它主要是概念/数学部分有没有一种(相对)简单易学的语言,它有一个简单的散列命令?我的一个朋友推荐了Python,但我不确定在一两天内我还能学到什么。我懂一点C语言,但哈希似乎比较复杂,需要额外的库


此外,如果有任何关于实际哈希命令的语法帮助,我们将不胜感激。程序本身需要能够支持奇数散列方法,比如将一个值散列两次或使用一个不变的集合salt,并且能够从stdin获取输入(用于像johntheripper这样的程序)

没有一种编程语言能在几天内学会。您可能能够弄清楚语法,但仅此而已。我喜欢这篇文章:

对于这一点,可能没有最好的编程语言。我可以推荐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));
}

我认为python对于这样的东西是一个很好的选择。它首先具有,如果您需要更多功能,则易于使用,并支持大量加密原语,包括哈希。若你们已经知道了一些C语言,那个么也许仅仅用它来学习会更容易。在任何情况下,为首选语言(尤其是加密类)学习加密库通常都是值得的,因为最终您会希望使用一些您不想手工编码的东西,并确信它是正确实现的

关于实际hash命令的语法,下面是一个使用PyCrypto的python示例,用于获取SHA256哈希(使用python 3.2):

产生输出

5c1940d2a11cd8b1e256ea4183ba22cddfa7cc0d00610a159bd7f5886d01067a

假设只要求您使用散列函数,而不是自己实现散列函数,那么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'
导入hashlib >>>s='要散列的内容' >>>sb=s.encode(“utf8”) >>>hashlib.md5(sb) >>>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'
导入hashlib >>>s='要散列的内容' >>>hashlib.md5(s) >>>hashlib.md5(s.hexdigest()) “6f4815fdf1f1fd3f36ac295bf39d26b4” >>>hashlib.sha1(s.hexdigest()) “72668bc961b0a78bfa1633f6141bcea69ca37468”
python中的
hashlib
库包含以下内容:

'md5', 'new', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'
详情请参阅:


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

在PHP中,您只需编写
sha1($password)
md5($password)
。它非常容易学会使用。我完全不同意。你可以在不到一天的时间里学习python——当然,你不知道细节,但你有足够的基础知识来做这件事吗?当然。如果你已经理解了编程的原理,那么任何值得一试的编程语言(这是双关语吗?)都可以在几分钟内学会。语言就是语法。是的,每种语言都有文化方法,但任何程序员都可以在很大程度上使用一种语言,而不真正了解它的文化(例如,我现在正在使用的语言虽然不太通俗,但功能完善。(学习编程是另一回事,学习一种语言只是其中的一小部分。)我知道,几乎任何一种语言都很容易学会“让它工作”。然而,你很难在一天内学会任何有用的东西。根据我的经验,一种语言最重要的部分是可用的库。语言之间也有许多微妙的差异,这可能会让不小心的人绊倒。一种语言远远超出了语法。为什么你会推荐一种语法复杂的语言给那些明确表示需要快速学习该语言的人?@Marcin:我个人认为C#并不难学。基本语法一点也不复杂,而且大多数其他功能对于一个简单的哈希程序来说都不是必需的。我是根据我的经验,我是通过编写一个(中小型)项目来学习C的。我没有以任何方式贬低python。我同意python是学习编程的好语言,但我更喜欢C。
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