2012-04-01 64 views
3

我正在尋找創建一個簡單的暴力破解密碼,它將散列stdin的輸入並將結果與​​現有散列(用於我的證券類)進行比較。使用md5/sha1散列命令的簡單編程語言?

雖然我從來沒有做過任何涉及散列的實際編程,因爲它大部分是迄今爲止的概念/數學部分。 是否有一個(相對)易於學習的語言,它有一個簡單的哈希命令?我的一位朋友推薦Python,但我不確定是否還有其他東西可以在一兩天內拿起。我知道一些C,但哈希似乎相對複雜,需要額外的庫。

此外,任何語法幫助與實際的散列命令將不勝感激。程序本身需要能夠支持奇怪的哈希方法,比如兩次散列值或者使用不改變的集合salt,並且能夠從stdin中獲取輸入(用於像johntheripper這樣的程序)。

+1

在PHP中,你可以只寫'SHA1($密碼)'或'MD5($的密碼)'。學習使用非常簡單。 – theJollySin 2012-04-01 00:31:23

回答

12

假設你只是被要求使用散列函數,而不是執行哈希自己,Python's hashlib module具有例程的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' 
-1

幾天之內就不會學到任何值得用鹽的編程語言。您可能能夠理解語法,但沒有太多。我喜歡這篇文章:http://norvig.com/21-days.html

這可能沒有最好的編程語言。我可以推薦C#,因爲它在System.Security.Cryptography中有簡單的加密類。

要找到一個字節數組的MD5哈希值,你可以使用這樣的事情:

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

要使用SHA1,只是SHA1代替MD5。

如果你想獲得一個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 - 當然,你不會知道前後關係,但是有一個基本的知識並且足以做到這一點?當然。 – 2012-04-01 00:40:11

+2

*如果你已經理解了編程的原理,那麼任何*值得用它的編程語言都可以在幾分鐘內學會。語言*是語法。是的,每種語言都有文化方法,但任何程序員都可以在很大程度上使用某種語言,而不必真正理解其文化(例如,相當不繁雜,但功能完善的[avro API](http://pypi.python.org/) (學習編程是另一回事,學習一種語言只是其中的一小部分) – kojiro 2012-04-01 00:42:12

+0

我知道很容易學到足以讓它工作',幾乎所有的語言都可以使用,但是,你很難在一天內學到任何有用的東西,根據我的經驗,語言中最重要的部分是可用的庫,語言之間也有許多細微的差別,那些不小心的人語言遠遠超出語法 – 2012-04-01 00:48:24

2

我認爲python是這樣的一個很好的選擇。它有hashlib module開始,如果你需要更多的權力,PyCrypto toolkit易於使用,並支持大量的加密原語,包括哈希。如果你已經知道一些C,那麼也許只是使用openssl libraries就可以讓你更容易找到答案。在任何情況下,爲您的首選語言(特別是加密類)學習加密庫通常是值得的投資,因爲最終您會想要使用您不想手動編寫的代碼並確信它正確實施。

至於帶有實際散列命令的語法,下面是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 
2

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 
0

這個小蟒蛇程序最適合這些類型的小型工作

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