nodejs抓取动态网页(使用NODEJS解密bitshares网页钱包备份文件有一位(19~61))
优采云 发布时间: 2021-12-14 02:01nodejs抓取动态网页(使用NODEJS解密bitshares网页钱包备份文件有一位(19~61))
使用NODEJS解密bitshares网络钱包备份文件
我博客的一位读者问了我一个问题。我忘记了比特股钱包的密码,想写一个暴力破解的程序,但是找不到相关的代码和调用方法。我带着这个问题在代码中寻找,写了一个简单的程序。这篇文章解释了这个程序的逻辑。
其实主要逻辑在19~61行,就是decryptWalletBackup函数,是从bitshares-ui复制过来的(请看18行注释)。该函数接受两个参数,backup_wif 和backup_buffer。前者是wif格式的私钥(参考这篇博文),后者是钱包备份文件(.bin)的内容。backup_wif 是怎么来的?参考第 71 行,是密码的确定性函数。
在第74行调用decryptWalletBackup函数,如果密码正确,则调用console.log的第75行,否则调用console.error的第76行。如果你使用nodejs进行暴力破解,不断修改密码,看看decryptWalletBackup函数能否解析promise。
其实代码分析就到这里了,也许读者会觉得很无聊,因为这个分析看起来有点简单。那么,难点是什么?一般来说,知识并不难,获取知识和应用知识的过程比较困难。授人以渔不如授人以渔:具体而言,本文试图回答两个主要问题,并在阐述第二个主要问题时提出两个小问题和我的想法。
第一个问题是如何从开源代码中快速准确的找到需要的功能?这其实是一个读码方法问题。我的回答:作者的逻辑框架应该从代码中重构,在合理的层次上抽象。对于一个具体的问题,当一个人不知道去哪里找相关的代码时,需要从整体上理解代码的框架,然后有针对性地阅读感兴趣的部分,根据自己的情况进行局部测试理解。就像乐高积木一样,别人建造的建筑物,我们需要从某些部分中学习并建造一个新的。这样做的方法是移除需要的部分并重新构建它。比如本文讨论的问题需要局部蛮力破解。如果你想知道代码在哪里,
从这个角度看,按照目标分解,一步步搜索,你可以找到你想要的任何组件,以及它调用的任何库方法。
第二个问题是如何控制抽象层次,避免深入细节?这个问题比第一个问题更具体,需要经常练习。第一个问题的回答中提到的“合理抽象”也是一个意思。就像盲人摸象,其实,如果每个盲人都关注大象的每一部分,只要目标允许,就是合理的。关键是要搞清楚他所关心的部分与整头大象的关系,不要以整体代替部分为好。研究代码,不需要一次性理解所有部分,修改或使用部分代码。从代码的整体结构往下看,一层一层往下看,找到一个可以满足目标的可能解决方案,放手吧。验证,通过实际操作反馈调整你的逻辑假设,重新验证,通过多次迭代,快速完成目标。对于频繁训练,迭代次数可以是个位数。其实我没学过用过React,但不妨碍我对React的组件编程模型的大体了解,也不妨碍我从大型React项目中找到有趣的部分(网页)(bitshares-ui) 钱包备份解密方法)并使用它。聚焦目标,通过抽象隐藏细节,理清组件之间的接口关系是关键。我列举了2个小问题,在这里给出我的想法,也许读者会更好地理解。通过实际操作反馈调整你的逻辑假设,并重新验证,这样你可以通过多次迭代快速完成目标。对于频繁训练,迭代次数可以是个位数。其实我没学过用过React,但不妨碍我对React的组件编程模型的大体了解,也不妨碍我从大型React项目中找到有趣的部分(网页)(bitshares-ui) 钱包备份解密方法)并使用它。聚焦目标,通过抽象隐藏细节,理清组件之间的接口关系是关键。我列举了2个小问题,在这里给出我的想法,也许读者会更好地理解。通过实际操作反馈调整你的逻辑假设,并重新验证,这样你可以通过多次迭代快速完成目标。对于频繁训练,迭代次数可以是个位数。其实我没学过用过React,但不妨碍我对React的组件编程模型的大体了解,也不妨碍我从大型React项目中找到有趣的部分(网页)(bitshares-ui) 钱包备份解密方法)并使用它。聚焦目标,通过抽象隐藏细节,理清组件之间的接口关系是关键。我列举了2个小问题,在这里给出我的想法,也许读者会更好地理解。对于频繁训练,迭代次数可以是个位数。其实我没学过用过React,但不妨碍我对React的组件编程模型的大体了解,也不妨碍我从大型React项目中找到有趣的部分(网页)(bitshares-ui) 钱包备份解密方法)并使用它。聚焦目标,通过抽象隐藏细节,理清组件之间的接口关系是关键。我列举了2个小问题,在这里给出我的想法,也许读者会更好地理解。对于频繁训练,迭代次数可以是个位数。其实我没学过用过React,但不妨碍我对React的组件编程模型的大体了解,也不妨碍我从大型React项目中找到有趣的部分(网页)(bitshares-ui) 钱包备份解密方法)并使用它。聚焦目标,通过抽象隐藏细节,理清组件之间的接口关系是关键。我列举了2个小问题,在这里给出我的想法,也许读者会更好地理解。也不妨碍我从大型 React 项目(bitshares-ui)钱包备份解密方法中找到有趣的部分(网页)并使用它。聚焦目标,通过抽象隐藏细节,理清组件之间的接口关系是关键。我列举了2个小问题,在这里给出我的想法,也许读者会更好地理解。也不妨碍我从大型 React 项目(bitshares-ui)钱包备份解密方法中找到有趣的部分(网页)并使用它。聚焦目标,通过抽象隐藏细节,理清组件之间的接口关系是关键。我列举了2个小问题,在这里给出我的想法,也许读者会更好地理解。
小问题1:如何使用其他编程语言(C++/Python/Go)解密网络钱包?由于这个问题的上下文与本文讨论的主要问题不同,因此所需的知识也不同。如果要自己实现,需要从bitsharesjs库中了解网络钱包的格式、压缩和加密方式,并从其他编程语言中重新组织这些逻辑。问题是,如果没有这样的目标,就不需要了解那么多,直接理解上面提到的接口调用就可以了。
问题二:网络钱包备份的格式是什么?这个问题可以从问题1推导出来。我的回答是,我对它了解不多,但如果有必要,可以用N个级别来解释。可以肯定的是,网络钱包的前 33 个字节是临时公钥的二进制形式,后面是存储在 AES 加密中的内容。在这个AES加密的内容中,肯定有与之前的公钥相关的部分,这样解密过程就可以直接判断密码是否正确。这个结论是从bitshares-ui中文件中的代码推导出来的,但是对于更详细的结构,比如在解密过程中如何验证密码的正确性,还得研究bitsharesjs库中AES.decrypt_with_checksum的实现.
好了,本文到此结束,感谢看到这里的朋友。如果您有任何问题,请随时与我联系。也许我可以帮你解决一个问题,同时与更多的朋友分享一些想法。