Luc*_*cas 12 python string encryption hash
我需要的是散列一个字符串.它不必是安全的,因为它只是文本文件中的隐藏短语(它不一定是人眼可识别的).
它不应该只是一个随机字符串,因为当用户键入字符串时我想将其哈希并将其与已经散列的字符串(来自文本文件)进行比较.
为此目的最好的是什么?可以使用内置类完成吗?
Kyl*_*ley 35
首先,让我说你不能保证独特的结果.如果您想要宇宙中所有字符串的唯一结果,那么最好存储字符串本身(或压缩版本).
更多关于这一点.我们首先得到一些哈希值.
您可以使用任何主要的加密哈希来通过几个步骤来对字符串进行哈希:
>>> import hashlib
>>> sha = hashlib.sha1("I am a cat")
>>> sha.hexdigest()
'576f38148ae68c924070538b45a8ef0f73ed8710'
Run Code Online (Sandbox Code Playgroud)
就内置插件而言,您可以选择SHA1,SHA224,SHA256,SHA384,SHA512和MD5.
哈希函数通过获取可变长度的数据并将其转换为固定长度的数据来工作.
在内置的每个SHA算法的情况下,固定长度hashlib
是名称中指定的位数(除了sha1为160位).如果您希望更好地确定两个字符串不会在同一个存储桶中结束(相同的哈希值),请选择具有更大摘要(固定长度)的哈希值.
按排序顺序,这些是您必须使用的摘要大小:
Algorithm Digest Size (in bits)
md5 128
sha1 160
sha224 224
sha256 256
sha384 384
sha512 512
Run Code Online (Sandbox Code Playgroud)
消化得越大,你碰撞的可能性就越小,前提是你的哈希函数是值得的.
hash()
?内置hash()
函数返回整数,这也可以很容易地用于您概述的目的.但是有问题.
>>> hash('moo')
6387157653034356308
Run Code Online (Sandbox Code Playgroud)
如果你的程序将在不同的系统上运行,你不能确定它hash
会返回相同的东西.实际上,我使用64位Python在64位盒子上运行.这些值将与32位Python完全不同.
对于Python 3.3+,正如@gnibbler指出的那样,hash()
在运行之间是随机的.它适用于单次运行,但几乎肯定不会在程序运行中起作用(从您提到的文本文件中提取).
为什么会hash()
这样建造?好吧,内置哈希有一个特定的原因.哈希表/字典/在内存中查找表.不是用于加密,而是用于运行时的廉价查找.
不要使用hash()
,使用hashlib
.
您只需使用base64模块即可实现目标:
>>> import base64
>>> a = 'helloworld'
>>> encoded_str = base64.encodestring(a)
>>> encoded_str
'aGVsbG93b3JsZA=='
>>> base64.decodestring(encoded_str)
'helloworld'
>>>
Run Code Online (Sandbox Code Playgroud)
当然你也可以使用hashlib模块,它更安全,因为散列字符串不能(或非常非常难)解码后,但对于你的问题base64就足够了 - "它真的不必是安全的"
请注意,Python 的字符串哈希不是“定义的”——它可以而且确实会因版本和实现而异。因此存储 Python 字符串哈希会带来困难。CPython 的字符串哈希也不试图变得“晦涩”。
标准方法是使用专为此类事情设计的哈希函数。像这样:
>>> import hashlib
>>> encoded = hashlib.sha1("abcdef") # "abcdef" is the password
>>> encoded.hexdigest()
'1f8ac10f23c5b5bc1167bda84b833e5c057a77d2'
Run Code Online (Sandbox Code Playgroud)
那一长串十六进制数字就是“哈希值”。SHA-1 是一种“强”哈希函数。如果您发现两个散列为相同值的字符串,您就会出名;-) 并且给定相同的输入,它将在 Python 的所有版本和实现的所有平台上返回相同的“hexdigest”。