2010-11-30 47 views
6

這是一個難題,我真的很煩,我無法解決它!所以,如果有人有空閒時間,我想在這裏提出一些關於如何解決它的建議!這是字符串Base64嗎?我怎麼知道什麼是使用的編碼?

我使用的軟件將密碼存儲在oracle數據庫中。密碼字段的類型是Varchar2(100個字符)。在我看來,軟件編碼密碼並將編碼的字符串存儲在數據庫中。

我的密碼是'1234',編碼的字符串是'cRDtpNCeBiql5KOQsKVyrA0sAiA ='。數據庫中的所有密碼長度爲28個字符。

我已經分配給自己的難題是找到字符串的編碼和/或加密。我第一次檢查是在Base64編碼

所以這是我在Python第一次測試(空閒):

>>> import base64 
>>> encoded = 'cRDtpNCeBiql5KOQsKVyrA0sAiA=' 
>>> decoded = base64.b64decode(encoded) 
>>> decoded 
'q\x10\xed\xa4\xd0\x9e\x06*\xa5\xe4\xa3\x90\xb0\xa5r\xac\r,\x02 ' 
>>> print decoded 
qíᄂО*ᆬ䣐ᄚᆬrᆲ 

這裏是我的第二個測試:

>>> myString = '1234' 
>>> encoded = base64.b64encode(myString) 
>>> encoded 
'MTIzNA==' 
>>> decoded = base64.b64decode('MTIzNA==') 
>>> decoded 
'1234' 

所以,我的首先想到的是,這不是Base64編碼的。在查看維基百科(https://en.wikipedia.org/wiki/Base64)後,似乎Base64編碼的字符串不是固定的大小。我的第二個想法是,字符串被加密,然後編碼到Base64,這就是爲什麼我得到奇怪的解碼字符串。

任何想法?

+0

可能是sha1 hash的base64編碼爲len(base64.b16encode(base64.b64decode('cRDtpNCeBiql5KOQsKVyrA0sAiA =')))```40`? – 2010-11-30 10:14:32

+0

我想知道將SHA1哈希解密爲密碼是多麼困難(因爲我知道所有約束條件(最小長度,最大長度,阿爾法,首都,數字,特殊字符等)......)也許我應該問另一個問題! :) – 2010-11-30 11:22:15

+0

丹我不明白你爲什麼使用b16encode,你能解釋一下嗎? – 2010-11-30 11:23:24

回答

13

它實際上是Base64編碼的。然而,它不是編碼的密碼本身,而是它的SHA-1散列。

from sha import sha 
print 'cRDtpNCeBiql5KOQsKVyrA0sAiA='.decode('base64').encode('hex') 
print sha('1234').hexdigest() 

或用於Python的較新版本:

from hashlib import sha1 
print 'cRDtpNCeBiql5KOQsKVyrA0sAiA='.decode('base64').encode('hex') 
print sha1('1234').hexdigest() 

的Base64編碼3個字節爲4個字符。由於您有27個字符並且只有一個填充,因此可以看到有20個編碼字節(27*3/4)。當有些安全相關的是20個字節(或160位)時,通常是一個SHA-1。當它是16字節(128位)時,通常是MD5。

順便說一句,向混合中添加隨機鹽總是一個好主意,所以兩個相同的密碼不會在數據庫中出現。在Linux上,crypt模塊可以爲您提供幫助,並引入更多的安全措施。

編輯:回答另一條評論 - 從「加密」密碼獲取原始文件非常容易。幾年前有一種名爲Rainbow Tables的技術。它甚至還有online versions。只需輸入你的哈希十六進制(7110eda4d09e062aa5e4a390b0a572ac0d2c0220),它會給你一秒鐘1234

5

雖然len(decoded) = 20那麼我猜這是Base64編碼的SHA1哈希。

您可以通過創造這樣編碼密碼:

import hashlib 
import base64 
passwd = '1234' 
hp = base64.b64encode(hashlib.sha1(passwd).digest()) 
print hp 
print len(hp) 

對於這種存儲密碼:這是不是很好,而許多餅乾可以使用具有預先計算的MD5,SHA1以及其他哈希,他們可以「彩虹」表根據這種散列獲取密碼。爲了防止它應該使用「鹽」:hash(salt+passwd),這樣的鹽可以是隨機的字符串保存在數據庫中的每個用戶或例如用戶登錄(永遠不能改變的東西)。

相關問題