这对我来说是一个难题,我真的很生气,我无法解决它!所以,如果有人有空闲时间,我想在这里提出一些如何解决它的建议!
我使用的软件将密码存储在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 :(得分: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。
crypt
模块可以帮助您实现这一目标并引发更多安全措施。
编辑:回答另一条评论 - 从“加密”密码中获取原始信息非常容易。有一种技术在几年前就被称为Rainbow Tables。它甚至有online versions个。只需以十六进制(7110eda4d09e062aa5e4a390b0a572ac0d2c0220
)键入您的哈希值,它就会在一秒钟内为您提供1234
。
答案 1 :(得分:6)
虽然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)
,这样的盐可以是每个用户保存在数据库中的随机字符串,或者例如用户登录(永远不能改变的东西)。