我正在将Django站点移植到Node.js,我正在尝试在Node中重新实现Django set password方法.这是Django代码
from django.utils.crypto import (
pbkdf2, get_random_string)
import hashlib
password = 'text1'
algorithm = "pbkdf2_sha256"
iterations = 10000
salt = 'p9Tkr6uqxKtf'
digest = hashlib.sha256
hash = pbkdf2(password, salt, iterations, digest=self.digest)
hash = hash.encode('base64').strip()
print "%s$%d$%s$%s" % (self.algorithm, iterations, salt, hash)
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的Node.js代码:
var password = 'text1';
var hashed = crypto.createHash('sha256').update(password, 'utf8').digest();
var salt = 'p9Tkr6uqxKtf';
var algorithm = "pbkdf2_sha256";
var iterations = 10000;
crypto.pbkdf2(hashed, salt, iterations, 32, function(err, encodedPassword) {
var newPass = new Buffer(encodedPassword).toString('base64');
console.log(encodedPassword);
// console.log(Buffer(encodedPassword, 'binary').toString('hex')); …
Run Code Online (Sandbox Code Playgroud) 的文档hashlib.scrypt
有点短:
hashlib.scrypt(密码, *, 盐, n, r, p, maxmem=0, dklen=64)
该函数提供 RFC 7914 中定义的基于 scrypt 密码的密钥派生函数。
密码和盐必须是类似字节的对象。应用程序和库应将密码限制在合理的长度(例如 1024)。salt 应该是大约 16 或更多字节,来自正确的源,例如 os.urandom()。
n 是 CPU/内存成本因子,r 是块大小,p 并行化因子和 maxmem 限制内存(OpenSSL 1.1.0 默认为 32 MiB)。dklen 是派生密钥的长度。
我发现它n
必须是 2 的幂并且至少是 2。
除此之外,我感觉有点孤独。hashlib.scrypt(b"foo", salt=b"bar", n=2, r=1, p=1)
今天被认为是安全的吗?如何判断采用哪些参数?
在Python 2.7中,
my = "my"
key = "key"
print(hashlib.sha256(my + key).hexdigest())
print(hmac.new(my, key, hashlib.sha256).hexdigest())
Run Code Online (Sandbox Code Playgroud)
输出,
5e50f405ace6cbdf17379f4b9f2b0c9f4144c5e380ea0b9298cb02ebd8ffe511
15a55993a27e0de7a4c4daa67a7c219199a464ca283797f545b783cce07b38a5
Run Code Online (Sandbox Code Playgroud)
还是我误解了?
python 2.6报告md5模块已过时,应使用hashlib.如果我import md5
改为import hashlib
我将解决python 2.5和python 2.6,但不适用于python 2.4,它没有hashlib模块(导致ImportError,我可以捕获).
现在,要修复它,我可以执行try/catch,并定义一个getMd5()函数,以便根据try块的结果定义一个合适的函数.这个解决方案好吗?
你会如何在一个更一般的情况下解决这个问题,例如:你有两个不同的库具有相同的目标但不同的界面,你想要使用一个,但如果第一个没有,则退回并使用另一个找到.
我想创建一个hashlib
实例,update()
然后以某种方式保留其状态。稍后,我想使用此状态数据重新创建对象,并继续update()
它。最后,我想获得hexdigest()
累计数据的总和。状态持久性必须在多次运行中保持不变。
例子:
import hashlib
m = hashlib.sha1()
m.update('one')
m.update('two')
# somehow, persist the state of m here
#later, possibly in another process
# recreate m from the persisted state
m.update('three')
m.update('four')
print m.hexdigest()
# at this point, m.hexdigest() should be equal to hashlib.sha1().update('onetwothreefour').hextdigest()
Run Code Online (Sandbox Code Playgroud)
编辑:
2010 年,我没有找到使用 python 实现此目的的好方法,最终用 C 语言编写了一个小型辅助应用程序来实现此目的。然而,下面有一些我当时无法获得或不知道的很好的答案。
我正在尝试编写一个Python脚本,它将获取目录中所有文件的md5sum(在Linux中).我相信我已经在下面的代码中完成了.
我希望能够运行它以确保目录中没有文件已更改,并且没有添加任何文件以进行删除.
问题是我是否对目录中的文件进行了更改,然后将其更改回来.我从运行下面的函数得到了不同的结果.(即使我更改了修改后的文件.
谁能解释一下呢.如果你能想到一个解决方法,请告诉我?
def get_dir_md5(dir_path):
"""Build a tar file of the directory and return its md5 sum"""
temp_tar_path = 'tests.tar'
t = tarfile.TarFile(temp_tar_path,mode='w')
t.add(dir_path)
t.close()
m = hashlib.md5()
m.update(open(temp_tar_path,'rb').read())
ret_str = m.hexdigest()
#delete tar file
os.remove(temp_tar_path)
return ret_str
Run Code Online (Sandbox Code Playgroud)
编辑: 正如这些优秀的人已经回答,看起来tar包括标题信息,如修改日期.使用zip工作会有什么不同或其他格式吗?
还有其他的解决方法吗?
为什么使用openssl的哈希值与我在python中得到的哈希值不同?
$ echo "Lorem ipsum" | openssl dgst -sha1 -hex
(stdin)= d0c05753484098c61e86f402a2875e68992b5ca3
$ python
>>> from hashlib import sha1
>>> sha("Lorem ipsum").hexdigest()
'94912be8b3fb47d4161ea50e5948c6296af6ca05'
>>> from Crypto.Hash import SHA
>>> SHA.new("Lorem ipsum").hexdigest()
'94912be8b3fb47d4161ea50e5948c6296af6ca05'
Run Code Online (Sandbox Code Playgroud)
字符串不相同吗?我错过了一些明显的东西吗
编辑:感谢您发现它.从一个文件管道保存的消息,该文件也遭受同样恼人的换行问题.
$ cat message | openssl dgst -sha1 -hex
'keep whacking your head mate, it wont be the same'
$ echo -n $(cat message) | openssl dgst -sha1 -hex
'ok, you got me, for now'
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用请求库在Python 3.4中为API调用创建HMAC-SHA512签名请求.我正在尝试关注文档,但是我遇到了这个错误:
AttributeError: '_hashlib.HASH' object has no attribute 'new'
Run Code Online (Sandbox Code Playgroud)
这是一些代码.它失败了hmac构造函数的错误.如果我尝试传递hashlib.md5()或完全省略摘要参数,那就没问题.
我不确定我之后是否正确签署了请求,因为我还没有那么远.我试图使用的服务的文档说我用我的秘密签署URL.我需要这个字节串才能使用.
import hmac
import hashlib
import requests
secret = b'mysecret'
url = b'http://someurl.com/something/'
signing = hmac.new(secret, url, hashlib.sha512())
headers = {'apisign': signing.digest()}
response = requests.get(url, headers=headers)
Run Code Online (Sandbox Code Playgroud)
任何指针赞赏.我找不到一个例子.谢谢!
我在C代码中做了两个SHA1,一个是字符串,另一个是整数,得到不同的结果.
SHA_init(&ctx);
SHA_update(&ctx, "1234", 4);
sha = SHA_final(&ctx);
unsigned n = 1234;
SHA_init(&ctx);
SHA_update(&ctx, &n, sizeof(n));
sha = SHA_final(&ctx);
string result: 7110eda4d09e62aa5e4a390b0a572acd2c220
integer result: c7f07b846cc46631c2079cdd7179afdd783d643
Run Code Online (Sandbox Code Playgroud)
在python中,很容易得到字符串SHA1
sha1 = hashlib.sha1()
sha1.update('1234')
sha1.hexdigest()
'7110eda4d09e062aa5e4a390b0a572ac0d2c0220'
Run Code Online (Sandbox Code Playgroud)
我们可以看到字符串结果与C代码相同.但是如何在python中获取整数SHA1?因为python sha1不支持整数.
我尝试了以下代码,但它无法获得与C代码相同的结果.
aint = unpack('>4B', pack('>I', 1234))
sha1 = hashlib.sha1()
sha1.update(bytearray(aint))
sha1.hexdigest()
Run Code Online (Sandbox Code Playgroud)
'ac9928e78cf6ea117451ecd6654fea2adae73e21'
如何在python中执行整数SHA1?
如何将无符号整数(表示用户ID)转换为随机查找但实际上是确定性可重复的选择?必须以相同的概率选择选择(不管输入整数的分布如何).例如,如果我有3个选择,即[0, 1, 2]
,用户ID 123可以总是随机分配选项2,而用户ID 234可以总是被分配选择1.
需要跨语言和跨平台的算法再现性.除非有更好的方法,否则我倾向于使用哈希函数和模数.这是我有的:
>>> num_choices = 3
>>> id_num = 123
>>> int(hashlib.sha256(str(id_num).encode()).hexdigest(), 16) % num_choices
2
Run Code Online (Sandbox Code Playgroud)
我正在使用最新的稳定Python 3.请注意,这个问题与将字符串转换为随机但确定性可重复的统一概率的相关问题类似但不完全相同.