【问题标题】:Is this string Base64? How can I tell what is the encoding used?这个字符串是 Base64 吗?我怎么知道使用的编码是什么?
【发布时间】:2010-11-30 10:08:56
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 这可能是 sha1 哈希的 base64 编码,因为 len(base64.b16encode(base64.b64decode('cRDtpNCeBiql5KOQsKVyrA0sAiA=')))40
  • 我想知道将 SHA1 哈希解密到密码中会有多困难(好吧,这并不是真正解密),因为我知道所有约束(最小长度、最大长度、alpha、大写、数字、特殊字符等)...也许我应该问另一个问题! :)
  • 我不明白你为什么使用b16encode,你能解释一下吗?
  • 查看我关于“解密”的最新编辑。

标签: python oracle encryption encoding base64


【解决方案1】:

它实际上是 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 模块可帮助您解决此问题并提供更多安全措施。

编辑:回答另一条评论 - 从“加密”密码中获取原始密码非常容易。几年前有一种技术很出名,叫做彩虹表。甚至还有online versions。只需以十六进制 (7110eda4d09e062aa5e4a390b0a572ac0d2c0220) 输入您的哈希值,它会在一秒钟内为您提供1234

【讨论】:

  • 这引出了一个问题,什么不安全的软件在没有任何盐的情况下存储密码?
  • import hashlib 会更合适(idle 抱怨 sha 已弃用)。除此之外,答案还不错,谢谢!
  • 马修,系统存储密码没有任何盐,并且系统在linux上运行。
  • 关于 Python 文档中的 sha 模块:自 2.5 版起已弃用:改用 hashlib 模块
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2020-04-15
    • 2015-11-09
    • 1970-01-01
    • 2023-03-22
    • 2021-03-09
    • 2012-08-12
    相关资源
    最近更新 更多