【问题标题】:MD5 Encrypting WoesMD5 加密问题
【发布时间】:2013-07-22 19:15:30
【问题描述】:

我用 Python 编写了一个加密程序,我的选择之一是 md5 加密。当我通过我的 md5 加密运行一个已知字符串时,我会收到一个不同的哈希值,然后如果我通过 md5 加密网站或 cryptofox for firefox 运行完全相同的字符串。

例如。我的程序哈希输出 - fe9c25d61e56054ea87703e30c672d91 - 明文:g4m3

例如。在线哈希/cryptofox - 26e4477a0fa9cb24675379331dba9c84 - 明文:g4m3

完全相同的单词,2 个不同的哈希值。 现在这是我的代码片段:

word="g4m3"
string=md5.new(word).hexdigest()
print string

【问题讨论】:

  • 注意MD5是一种散列机制,不是加密机制。

标签: python encryption md5


【解决方案1】:

您在 MD5 输入字符串中包含换行符:

>>> import md5
>>> word="g4m3"
>>> md5.new(word).hexdigest()        # no newline
'26e4477a0fa9cb24675379331dba9c84'
>>> md5.new(word + '\n').hexdigest() # with a newline
'fe9c25d61e56054ea87703e30c672d91'

从文件读取数据时,请确保删除行尾的换行符。您可以使用.rstrip('\n') 仅删除行尾的行分隔符,或使用.strip() 删除行首或行尾的所有空格:

>>> word = 'g4m3\n'
>>> md5.new(word).hexdigest()
'fe9c25d61e56054ea87703e30c672d91'
>>> word = word.strip()
>>> md5.new(word).hexdigest()
'26e4477a0fa9cb24675379331dba9c84'

【讨论】:

  • hmm,我在单词之后得到了 word.strip('\r'\n')(它实际上是一个更大的脚本的一部分,我只是在 sn-p 中抛出)会删除换行符?还是我错过了其他东西?如果您想看一下,整个代码都发布在hastebin.com/micoluyoni.tex。我使用列表中的选项 2 只是为了测试我的 m5d 代码,因为如果它在那里出错......它在我的代码中到处都是错误的
  • @L8NIT3TR0UBL3:这里不需要去掉\r,Python 规范化文本文件以在所有平台上使用\n 换行。
  • @L8NIT3TR0UBL3 作为一个单独的点,“\r\n”也将被视为一个单独的字符,从而进一步改变你的哈希值。我对 python 了解不多,但我会接受上面 Martijn 的建议
  • @L8NIT3TR0UBL3:你需要赋值.strip()的返回值。字符串是不可变的,所以word.strip() 什么都不做。请改用word = word.strip()
  • 完美!!我会试试看的!非常感谢!这正是我带着我的问题来到这个网站的原因,一大堆超级快速、知识渊博的答案!
【解决方案2】:

至于您的问题:散列非常敏感。即使是一个不同的字符也可能导致完全不同的输出字符串。在线实现可能会附加一个空白字符,或者更可能是一个换行符。这个额外的字符将改变算法的输出。 (也有可能发生相反的情况:您添加了一个换行符而在线没有)

关于 MD5“加密”: MD5 是 NOT 加密。它是散列。加密接收数据和密钥,并输出随机数据。该数据是可恢复的。另一方面,散列接收数据并吐出代表原始数据的有限数量的数据。但是,除非存储在其他地方,否则原始数据会丢失。

更多信息参考: 另一个有趣的区别是各种类型的算法吐出的数据。加密可以接收任意数量的数据(当然是在操作系统/软件的范围内),并会输出一堆数据 appx。大小与输入数据相等。然而,散列不会。由于它只是数据的表示,因此它的输出有限。这可能会带来问题。例如,如果您有无限量的数据,最终,两个完全不同的数据将具有相同的哈希值。因此,在使用散列比较两个不同的值时,最好同时比较两个单独的散列。两个独立的数据具有两个相等的哈希的统计概率是天文数字的低。

当然,然后你会进入以加密方法为核心的散列算法,但我不会在这里讨论。

【讨论】:

  • 而 MD5 在技术上是一种加密哈希,这通常是混淆的来源。
  • @MartijnPieters 哦,我同意。在这两点上。这就是为什么我在答案中添加了更多内容
  • 现在稍微好点了;您可能希望将咆哮移至底部以专注于答案。 :-)
  • 我为滥用“加密”而道歉,我确实意识到 md5 是一种完全不同的散列算法,但解释肯定很棒,因为我不知道实际上有什么区别。
  • @L8NIT3TR0UBL3:如果您有兴趣,我已经添加了有关散列/加密的更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 2011-05-24
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 2011-06-27
相关资源
最近更新 更多