Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用模板构造md5哈希算法_Python_Algorithm_Hash_Md5 - Fatal编程技术网

Python 使用模板构造md5哈希算法

Python 使用模板构造md5哈希算法,python,algorithm,hash,md5,Python,Algorithm,Hash,Md5,所以这可能是一个奇怪的问题: hashlib.md5((hashlib.md5(salt).hexdigest())+(hashlib.md5(plaintext).hexdigest())).hexdigest() 这就是MyBB的哈希算法。在我的python程序中,这很容易实现。然而,当哈希算法未知时,用户需要输入一个哈希算法,我不知道如何实现它 所以基本上我想用用户输入的算法散列一些东西。如果他们的算法是: md5(salt + md5(password)) 我想做: hashlib.

所以这可能是一个奇怪的问题:

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中。

您可以用作解析器,例如:

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.algorithms
在沙盒环境之外运行它的风险是什么?我的意思是,它是一个运行客户端的python程序。@Aurora如果它是一个客户端程序,那么可能没有,至少我脑子里想不出任何东西。好的@贝雷尔,你能解释一下最后一句话吗?@Aurora很不幸,他想不出什么像样的话。另一种方法是使用解析表达式,然后手动计算语法树。执行类似的操作,但自定义实现可能会有点痛苦。我会非常小心使用
exec
,即使是客户端应用程序。例如,如果脚本以高权限运行,则可以将其用于升级(exec(“\uuu import\uuuu('subprocess')。call(['rm','-rf','/']))。我不确定这是否与你的情况有关,只是我对那些关于程序运行环境的假设有点偏执。你可能已经听说过这一点,但md5不再是散列密码的好选择。如果你只是想要一个校验和或者其他的东西,那可能没问题,但是为了安全起见,它不再被认为是安全的。您似乎在这里做密码加密,而不是校验和,所以我会考虑使用Sa256或更现代的东西。显示python内置内容的文档。您可以查看hashlib.algorithms以了解哪些算法是内置的。默认情况下,我的python实例显示sha512是可用的最新版本。@Rossdavhdh我正在开发一个hashcracker,因此算法的安全性或缺乏安全性并不是我真正关心的问题。谢谢你的建议。