使用模板构造md5哈希算法
Use template to construct md5 hash algorithm
所以这可能很奇怪:
hashlib.md5((hashlib.md5(salt).hexdigest())+(hashlib.md5(plaintext).hexdigest())).hexdigest()
这是 MyBB 的哈希算法。在我的 python 程序中,这很容易实现。但是,当哈希算法未知,并且要求用户输入一个时,我不知道如何实现。
所以基本上我想用用户输入的算法对某些东西进行哈希处理。如果他们的算法是:
md5(salt + md5(password))
我想做:
hashlib.md5(salt + hashlib.md5(password).hexdigest()).hexdigest()
帮忙?
哦,任何使用的模块都必须是原生的:预先包含在 Python 2.
您可以使用 Jinja2 作为解析器,例如:
import hashlib
from jinja2.sandbox import SandboxedEnvironment
def md5(s):
return hashlib.md5(s).hexdigest()
# Sandbox because the source is likely to be untrusted
env = SandboxedEnvironment()
# Parsing any formula, wrapped in {{ ... }}
template = env.from_string('{{md5(salt + md5(password))}}')
# Running it:
hash_ = template.render(md5=md5, salt='3Fd0@5l4x', password='secret')
# hash_ == u'10aaeb818dd269d75bf460469c6b90ab'
正如@nathancahill 正确建议的那样,您可以进一步改进它以包含更多算法:
import functools
def hexify(algorithm):
func = getattr(hashlib, algorithm)
@functools.wraps(func)
def hex_func(s):
return func(s).hexdigest()
return hex_func
algorithms = dict((name, hexify(name)) for name in hashlib.algorithms)
template.render(salt='3Fd0@5l4x', password='secret', **algorithms)
所以这可能很奇怪:
hashlib.md5((hashlib.md5(salt).hexdigest())+(hashlib.md5(plaintext).hexdigest())).hexdigest()
这是 MyBB 的哈希算法。在我的 python 程序中,这很容易实现。但是,当哈希算法未知,并且要求用户输入一个时,我不知道如何实现。
所以基本上我想用用户输入的算法对某些东西进行哈希处理。如果他们的算法是:
md5(salt + md5(password))
我想做:
hashlib.md5(salt + hashlib.md5(password).hexdigest()).hexdigest()
帮忙?
哦,任何使用的模块都必须是原生的:预先包含在 Python 2.
您可以使用 Jinja2 作为解析器,例如:
import hashlib
from jinja2.sandbox import SandboxedEnvironment
def md5(s):
return hashlib.md5(s).hexdigest()
# Sandbox because the source is likely to be untrusted
env = SandboxedEnvironment()
# Parsing any formula, wrapped in {{ ... }}
template = env.from_string('{{md5(salt + md5(password))}}')
# Running it:
hash_ = template.render(md5=md5, salt='3Fd0@5l4x', password='secret')
# hash_ == u'10aaeb818dd269d75bf460469c6b90ab'
正如@nathancahill 正确建议的那样,您可以进一步改进它以包含更多算法:
import functools
def hexify(algorithm):
func = getattr(hashlib, algorithm)
@functools.wraps(func)
def hex_func(s):
return func(s).hexdigest()
return hex_func
algorithms = dict((name, hexify(name)) for name in hashlib.algorithms)
template.render(salt='3Fd0@5l4x', password='secret', **algorithms)