车轮包装的RECORD文件中的哈希如何构造?

时间:2019-04-29 13:19:18

标签: python python-3.x base64 python-wheel

我需要知道.whl软件包文件中的RECORD文件是如何生成的。特别是它如何为每个文件生成sha256 ...

例如,我们可以看到以下行:

$ cat RECORD | grep WHEEL
pkv-X.Y.Z.dist-info/WHEEL,sha256=X8kVdBCq85ICewwfaE6btv5qKsFQfVq8NYJIXUK0i1A,104

似乎来自:

$ sha256sum <WHEEL | awk '{print $1}' | xxd -r -p | base64 | tr +/ -_ | cut -c -43
X8kVdBCq85ICewwfaE6btv5qKsFQfVq8NYJIXUK0i1A
$ wc -c <WHEEL
104

但是我想知道它是如何在python中构建的,因为我对trcut -c -43转换不太信任。
注意:在其他文件上,“似乎” tr是正确的,即/-> _+-> -,但我想使用负责此操作的python源代码...

到目前为止,在python 3.7中,

python3 -c "import hashlib; import base64; print(base64.b64encode(hashlib.sha256(open('WHEEL', 'rb').read()).digest()))"
b'X8kVdBCq85ICewwfaE6btv5qKsFQfVq8NYJIXUK0i1A='

注意:到目前为止,我{@ 3}}都没碰到运气...

1 个答案:

答案 0 :(得分:0)

您应该看看https://github.com/pypa/pip/blob/c9df690f3b5bb285a855953272e6fe24f69aa08a/src/pip/_internal/wheel.py#L71-L84

def rehash(path, blocksize=1 << 20):
    # type: (str, int) -> Tuple[str, str]
    """Return (hash, length) for path using hashlib.sha256()"""
    h = hashlib.sha256()
    length = 0
    with open(path, 'rb') as f:
        for block in read_chunks(f, size=blocksize):
            length += len(block)
            h.update(block)
    digest = 'sha256=' + urlsafe_b64encode(
        h.digest()
    ).decode('latin1').rstrip('=')
    # unicode/str python2 issues
    return (digest, str(length))  # type: ignore

这可以使用bash命令在manylinux2010映像中完成:

/opt/_internal/cpython-3.7.3/bin/python3 -c "\
import hashlib;\
import base64;\
print(\
 base64.urlsafe_b64encode(\
 hashlib.sha256(open('FILE_NAME', 'rb').read()).digest())\
 .decode('latin1')\
 .rstrip(b'=')\
 )"