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

相关问题