PHP中的代码我需要转到python
[md5 key] = md5( ( [Request Timestamp] % [Registration Window] ) . [salt] );
示例:
<?php
function get_md5_hash($strDatetime, $strAuthWindow, $strSalt) {
return md5((strtotime($strDatetime) % ((int)$strAuthWindow)) .$strSalt);
}
print get_md5_hash("2013-04-29T20:51:29GMT+0300", "604800", "155961");
?>
目前的Python代码
timestamp = datetime.datetime.now() - timedelta(hours=6)
timestamp_str = '{:%Y-%m-%dT%H:%M:%S}'.format(timestamp)
salt = "454243"
registration_window = "604800"
import hashlib
md5_key = hashlib.md5(((timestamp_str % registration_window) .salt).encode('utf-8')).hexdigest()
我无法通过此错误消息:
TypeError:并非在字符串格式化期间转换所有参数
答案 0 :(得分:3)
您遇到的问题基本上归结为timestamp_str
和registration_window
为字符串。在Python中,格式化字符串的一种方法是使用%
运算符。例如,
def sayGreeting(name):
return "Hello %s" % name
字符串上的此运算符与您要使用的运算符不同,后者是计算两个整数的余数的模运算符。
PHP中的strtotime
函数返回一个整数,它是日期和时间的字符串表示形式的Unix时间戳。要在Python中获得相同的结果,您还需要将时间戳转换为Unix时间戳整数。
使用.
运算符完成PHP中字符串的连接。但是,在Python中,这是+
运算符。这就是您需要将.salt
更改为+ salt
的原因,因为您将盐连接到Unix时间戳。
我写了一些代码来帮助你入门。
import datetime
import time
import hashlib
timestamp = datetime.datetime.now() - datetime.timedelta(hours=6)
unix_time = time.mktime(timestamp.timetuple())
salt = "454243"
registration_window = 604800
resulting_timestamp = str(unix_time % registration_window)
md5_digest = hashlib.md5(resulting_timestamp + salt).hexdigest()
请记住,永远不要将MD5用于任何需要考虑安全性的应用程序。它是不安全散列函数。
答案 1 :(得分:1)
使用此
md5_digest = hashlib.md5((resulting_timestamp + salt).encode('utf-8')).hexdigest()
答案 2 :(得分:1)
因此,在尝试寻找解决方案的另外~2周后,我仍然没有生成所需的md5哈希的工作python代码。但是我确实有一个&#34; hack&#34;确实有效的解决方案,所以我已经发布了这个解决方案,如果找到python解决方案,我会更新。
我所做的是在PHP中运行forumla并将解决方案导入我的python代码。
utils.py
import subprocess
proc = subprocess.Popen("php md5.php", shell=True, stdout=subprocess.PIPE)
script_response = proc.stdout.read()
script_response1 = script_response.decode().split('|')[0]
md5.php
<?php
$strAuthWindow = 604800;
$strSalt = "454243";
function get_md5_hash($strDatetime, $strAuthWindow, $strSalt) {
return md5((strtotime($strDatetime) % ((int)$strAuthWindow))
.$strSalt);
}
print("$strDatetime");
print get_md5_hash("$strDatetime,", "$strAuthWindow", "$strSalt");
?>