持久化 sha256 哈希对象?

2024-01-12

我需要一个 Python/C/C++/Java 实现,它可以暂停散列进度 and store文件的进度以这样的方式进行:可恢复的稍后从该文件中获取。

无论上面列出的语言是用什么语言编写的,它都应该在 Python 中正常工作。建议您提供它以便与“hashlib”很好地配合,但这不是必需的。另外,如果这样的东西已经存在,那么指向它的链接就足够了。

一个想法,您的实施应该实现什么目标。

import hashlib
import hashpersist #THIS IS NEEDED.

sha256 = hashlib.sha256("Hello ")
hashpersist.save_state(sha256, open('test_file', 'w'))

sha256_recovered = hashpersist.load_state(open('test_file', 'r'))
sha256_recovered.update("World")
print sha256_recovered.hexdigest()

这应该给出与我们使用标准 sha256 函数对“Hello World”进行简单哈希处理相同的输出。

a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

事实证明,重写 hashlib 使其可恢复比我想象的要容易,至少 SHA-256 部分是这样。我花了一些时间研究使用 OpenSSL 加密库的 C 代码,但后来我意识到我不需要所有这些东西,我可以只使用 ctypes。

重新散列.py

#! /usr/bin/env python

''' A resumable implementation of SHA-256 using ctypes with the OpenSSL crypto library

    Written by PM 2Ring 2014.11.13
'''

from ctypes import *

SHA_LBLOCK = 16
SHA256_DIGEST_LENGTH = 32

class SHA256_CTX(Structure):
    _fields_ = [
        ("h", c_long * 8),
        ("Nl", c_long),
        ("Nh", c_long),
        ("data", c_long * SHA_LBLOCK),
        ("num", c_uint),
        ("md_len", c_uint)
    ]

HashBuffType = c_ubyte * SHA256_DIGEST_LENGTH

#crypto = cdll.LoadLibrary("libcrypto.so")
crypto = cdll.LoadLibrary("libeay32.dll" if os.name == "nt" else "libssl.so")

class sha256(object):
    digest_size = SHA256_DIGEST_LENGTH

    def __init__(self, datastr=None):
        self.ctx = SHA256_CTX()
        crypto.SHA256_Init(byref(self.ctx))
        if datastr:
            self.update(datastr)

    def update(self, datastr):
        crypto.SHA256_Update(byref(self.ctx), datastr, c_int(len(datastr)))

    #Clone the current context
    def _copy_ctx(self):
        ctx = SHA256_CTX()
        pointer(ctx)[0] = self.ctx
        return ctx

    def copy(self):
        other = sha256()
        other.ctx = self._copy_ctx()
        return other

    def digest(self):
        #Preserve context in case we get called before hashing is
        # really finished, since SHA256_Final() clears the SHA256_CTX
        ctx = self._copy_ctx()
        hashbuff = HashBuffType()
        crypto.SHA256_Final(hashbuff, byref(self.ctx))
        self.ctx = ctx
        return str(bytearray(hashbuff))

    def hexdigest(self):
        return self.digest().encode('hex')

#Tests
def main():
    import cPickle
    import hashlib

    data = ("Nobody expects ", "the spammish ", "imposition!")

    print "rehash\n"

    shaA = sha256(''.join(data))
    print shaA.hexdigest()
    print repr(shaA.digest())
    print "digest size =", shaA.digest_size
    print

    shaB = sha256()
    shaB.update(data[0])
    print shaB.hexdigest()

    #Test pickling
    sha_pickle = cPickle.dumps(shaB, -1)
    print "Pickle length:", len(sha_pickle)
    shaC = cPickle.loads(sha_pickle)

    shaC.update(data[1])
    print shaC.hexdigest()

    #Test copying. Note that copy can be pickled
    shaD = shaC.copy()

    shaC.update(data[2])
    print shaC.hexdigest()


    #Verify against hashlib.sha256()
    print "\nhashlib\n"

    shaD = hashlib.sha256(''.join(data))
    print shaD.hexdigest()
    print repr(shaD.digest())
    print "digest size =", shaD.digest_size
    print

    shaE = hashlib.sha256(data[0])
    print shaE.hexdigest()

    shaE.update(data[1])
    print shaE.hexdigest()

    #Test copying. Note that hashlib copy can NOT be pickled
    shaF = shaE.copy()
    shaF.update(data[2])
    print shaF.hexdigest()


if __name__ == '__main__':
    main()

可恢复_SHA-256.py

#! /usr/bin/env python

''' Resumable SHA-256 hash for large files using the OpenSSL crypto library

    The hashing process may be interrupted by Control-C (SIGINT) or SIGTERM.
    When a signal is received, hashing continues until the end of the
    current chunk, then the current file position, total file size, and
    the sha object is saved to a file. The name of this file is formed by
    appending '.hash' to the name of the file being hashed.

    Just re-run the program to resume hashing. The '.hash' file will be deleted
    once hashing is completed.

    Written by PM 2Ring 2014.11.14
'''

import cPickle as pickle
import os
import signal
import sys

import rehash

quit = False

blocksize = 1<<16   # 64kB
blocksperchunk = 1<<8

chunksize = blocksize * blocksperchunk

def handler(signum, frame):
    global quit
    print "\nGot signal %d, cleaning up." % signum
    quit = True


def do_hash(fname, filesize):
    hashname = fname + '.hash'
    if os.path.exists(hashname):
        with open(hashname, 'rb') as f:
            pos, fsize, sha = pickle.load(f)
        if fsize != filesize:
            print "Error: file size of '%s' doesn't match size recorded in '%s'" % (fname, hashname)
            print "%d != %d. Aborting" % (fsize, filesize)
            exit(1)
    else:
        pos, fsize, sha = 0, filesize, rehash.sha256()

    finished = False
    with open(fname, 'rb') as f:
        f.seek(pos)
        while not (quit or finished):
            for _ in xrange(blocksperchunk):
                block = f.read(blocksize)
                if block == '':
                    finished = True
                    break
                sha.update(block)

            pos += chunksize
            sys.stderr.write(" %6.2f%% of %d\r" % (100.0 * pos / fsize, fsize))
            if finished or quit:
                break

    if quit:
        with open(hashname, 'wb') as f:
            pickle.dump((pos, fsize, sha), f, -1)
    elif os.path.exists(hashname):
        os.remove(hashname)

    return (not quit), pos, sha.hexdigest()


def main():
    if len(sys.argv) != 2:
        print "Resumable SHA-256 hash of a file."
        print "Usage:\npython %s filename\n" % sys.argv[0]
        exit(1)

    fname = sys.argv[1]
    filesize = os.path.getsize(fname)

    signal.signal(signal.SIGINT, handler)
    signal.signal(signal.SIGTERM, handler)

    finished, pos, hexdigest = do_hash(fname, filesize)
    if finished:
        print "%s  %s" % (hexdigest, fname)
    else:
        print "sha-256 hash of '%s' incomplete" % fname
        print "%s" % hexdigest
        print "%d / %d bytes processed." % (pos, filesize)


if __name__ == '__main__':
    main()

demo

import rehash
import pickle
sha=rehash.sha256("Hello ")
s=pickle.dumps(sha.ctx)
sha=rehash.sha256()
sha.ctx=pickle.loads(s)
sha.update("World")
print sha.hexdigest()

output

a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

edit

我刚刚做了一个小的编辑以允许rehash也可以在 Windows 上运行,尽管我只在 WinXP 上测试过它。这libeay32.dll可以在当前目录中,也可以在系统库搜索路径中的某个位置,例如WINDOWS\system32。我相当古老(且大多未使用)的 XP 安装无法找到 .dll,即使 OpenOffice 和 Avira 使用它。所以我只是将其从 Avira 文件夹复制到 system32。现在它工作得很好。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

持久化 sha256 哈希对象? 的相关文章

  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • 可以使用哪些技术来衡量 pandas/numpy 解决方案的性能

    Question 如何简洁全面地衡量下面各个功能的性能 Example 考虑数据框df df pd DataFrame Group list QLCKPXNLNTIXAWYMWACA Value 29 52 71 51 45 76 68 6
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信
  • 如何将带有参数的Python装饰器实现为类?

    我正在尝试实现一个接受一些参数的装饰器 通常带有参数的装饰器被实现为双重嵌套闭包 如下所示 def mydecorator param1 param2 do something with params def wrapper fn def
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • 使用 Java https 上传到 Imgur v3 错误

    我目前正在尝试使用他们当前的 API v3 上传到 imgur 但是我不断收到错误 错误 javax net ssl SSLException 证书中的主机名不匹配 api imgur com imgur com OR imgur com
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository

随机推荐

  • Java:将格式化的xml文件转换为一行字符串

    我有一个格式化的 XML 文件 我想将其转换为一行字符串 我该怎么做 示例 XML
  • Delphi 'AND' 评估有 2 个条件

    我不得不选择 Delphi 来完成我最近正在做的一项合同工作 我希望有人澄清的一件事是条件语句中逻辑的执行 例如if 我有 C C 和这些语言的背景 一旦if已知语句失败 其余逻辑不会执行 例如 if somefunc FALSE anot
  • 如何检测设备的移动?

    我想检测像 Moo Box 这样的运动 我反转手机 当我将其转回时 它会触发一个动作 对于安卓 什么是最好的方法 可以自定义事件监听器 你看过吗传感器管理器 http developer android com reference andr
  • 如何在 R 中使用 as.Date() 格式化我的日期?

    我有一个如下所示的数据集 Date AE AA AEF Percent 1 1 2012 1211 1000 3556 0 03 1 2 2012 100 2000 3221 0 43 1 3 2012 3423 10000 2343 0
  • asp mvc 默认应用程序生成删除空格

    因此 当生成一个 mvc 项目时 它具有默认的母版页和部分视图 例如注册和登录视图 问题是 生成的母版页在页面左侧和右侧具有默认的空白 我的问题是 边距空间代码写在哪里以及如何删除它 虽然看起来很简单 但我似乎找不到它 Site css 保
  • 类型推断在具有静态成员约束的泛型类型上失败

    我定义了以下类型 从代码简化 type Polynomial lt a when a static member public Zero a and a static member a a gt a and a static member
  • MATLAB 搜索元胞数组中的字符串子集

    我试图在 MATLAB 的元胞数组中查找子字符串出现的位置 下面的代码可以工作 但是相当难看 在我看来应该有一个更简单的解决方案 cellArray these are some nicewords and some morewords w
  • 无可用来源

    我不确定发生了什么或者我是否做了什么 现在 每当我尝试调试时 它都会说所有 BCL 内容都没有可用的源代码 例如 在 debug print 上我收到该消息 定位源 f dd ndp fx src CompMod System Diagno
  • MFCC Python:librosa、python_speech_features、tensorflow.signal 的结果完全不同

    我正在尝试从音频 wav 文件 中提取 MFCC 特征 并且我已经尝试过python speech features and librosa但他们给出了完全不同的结果 audio sr librosa load file sr None l
  • amCharts v5 模板适配器示例在作为 TypeScript 而不是 JavaScript 运行时抛出错误

    我正在尝试根据值更改条形颜色 即在 JS 中很简单 https codepen io team amcharts pen KKmbKBg editors 1111 但是当我在 TSX 文件中实现代码时 它给了我一个错误 正如你所看到的 VS
  • 循环 R 列

    我有一个data frame in R它由许多带有数值的列组成 像这样 A B C 0 6057 0 1644 6 93 0 5723 0 117 6 59 0 5614 0 1552 7 02 0 4102 0 1059 5 24 0 4
  • Entity Framework 7 Code First 中的一对一关系

    如何使用数据注释或 Fluent Api 在 Entity Framework 7 Code First 中配置一对一或零或一对一关系 您可以使用 Entity Framework 7 中的 Fluent API 定义 OneToOne 关
  • 在 Python 中从 opencv 3 创建类 Rect 的实例

    我想知道如何通过提供两个点来获取 opencv 矩形对象 C 版本提供了这个数据结构 http docs opencv org java 2 4 9 org opencv core Rect html http docs opencv or
  • 如何在 sbt 启动时运行命令并保持会话活动?

    如果我们定义initialCommands in console 1 1 这将在控制台执行后运行 是否可以在 sbt 启动后运行命令 例如initialCommands in sbtStartup console 自动进入控制台 我想保持会
  • Azure 个人访问令牌 API 中的 subjectDescriptor 是什么

    我正在尝试编写一个脚本来自动化 Azure DevOps 环境的某些方面 但我很难为特定用户返回 PAT 以便能够授权他们执行 API 调用 有人能给我一个关于 subjectDescriptor 是什么以及在哪里可以找到它的示例吗 我已读
  • VueJS - 模型绑定不适用于使用 jQuery 插件的输入

    我正在努力转换表单以利用 VueJS 该表单有一个使用 eonasdan bootstrap datetimepicker 的出生日期输入 http eonasdan github io bootstrap datetimepicker h
  • 为什么 Divi 短代码不能在 wp-json 中呈现?

    我正在尝试使用the content过滤器来处理 Divi 短代码 但短代码仍然出现 特别是 et pb section et pb column et pb text 如果有的话 add action rest api init func
  • 从 zip 文件加载 pickle 文件

    由于某种原因 我无法让 cPickle load 处理 ZipFile open 返回的文件类型对象 如果我对 ZipFile open 返回的文件类型对象调用 read 我可以使用 cPickle loads 例子 import zipf
  • Firebase 本地通知

    当 Firebase 回调时是否有可能触发本地通知 我猜我的线程有问题 Firebase setDispatchQueue dispatch get global queue DISPATCH QUEUE PRIORITY DEFAULT
  • 持久化 sha256 哈希对象?

    我需要一个 Python C C Java 实现 它可以暂停散列进度 and store文件的进度以这样的方式进行 可恢复的稍后从该文件中获取 无论上面列出的语言是用什么语言编写的 它都应该在 Python 中正常工作 建议您提供它以便与