这个字符串是Base64吗?我怎么知道使用的编码是什么?

问题描述 投票:6回答:2

这对我来说是一个难题,我真的很生气,我无法解决它!所以,如果有人有空闲时间,我想在这里提出一些如何解决它的建议!

我使用的软件将密码存储在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,这就是为什么我得到奇怪的解码字符串。

有任何想法吗?

python oracle encryption encoding base64
2个回答
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


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),这样的盐可以是每个用户保存在数据库中的随机字符串,或者例如用户登录(永远不能改变的东西)。

© www.soinside.com 2019 - 2024. All rights reserved.