- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
出于各种原因,我试图将 Python 模块移植到 NodeJS,但遇到了一些障碍。我在获取正确的 MD5 摘要时遇到了困难(是的,我知道 MD5 的安全问题,但对于我正在连接的应用程序来说,它要么是那个问题,要么是明文)。
这是一个简化的工作 Python 版本:
from hashlib import md5
username = 'username'
password = 'password'
nonce = '241d4105fe8f60cef84524f6'
cnonce = '7db4c8275fb38f94774c1fe7'
secret = '%s:my realm:%s' % (username, password)
digest = md5(secret).digest()
fullsecret = ':'.join([digest, nonce, cnonce])
hexdigest = md5(fullsecret).hexdigest()
print 'digest: %s' % digest
print 'digest char codes: ' + str([ord(c) for c in digest])
print 'fullsecret: %s' % fullsecret
print 'fullsecret char codes:\n ' + str([ord(c) for c in fullsecret])
print 'hexdigest: %s' % hexdigest
输出如下:
digest: ȣ�P��r�l������
digest char codes: [200, 163, 248, 16, 80, 182, 139, 114, 188, 108, 184, 141, 136, 168, 130, 198]
fullsecret: ȣ�P��r�l������:241d4105fe8f60cef84524f6:7db4c8275fb38f94774c1fe7
fullsecret char codes:
[200, 163, 248, 16, 80, 182, 139, 114, 188, 108, 184, 141, 136, 168, 130, 198, 58, 50, 52, 49, 100, 52, 49, 48, 53, 102, 101, 56, 102, 54, 48, 99, 101, 102, 56, 52, 53, 50, 52, 102, 54, 58, 55, 100, 98, 52, 99, 56, 50, 55, 53, 102, 98, 51, 56, 102, 57, 52, 55, 55, 52, 99, 49, 102, 101, 55]
hexdigest: 6f9d2b47bd232495c2f765ce5a5d8ba7
现在,对于我的 JavaScript 代码来说,我能得到的最接近的是以下代码:
var crypto = require('crypto');
var username = 'username';
var password = 'password';
var nonce = '241d4105fe8f60cef84524f6';
var cnonce = '7db4c8275fb38f94774c1fe7';
var secret = username + ':my realm:' + password;
var digest = crypto.createHash('md5').update(secret).digest('binary');
var fullsecret = [digest, nonce, cnonce].join(':');
var hexdigest = crypto.createHash('md5').update(fullsecret).digest('hex');
console.log('digest: ' + digest);
// console.log('digest char codes: [' + digest.map((x) => { return x; }).join(', ') + ']');
console.log('fullsecret: ' + fullsecret);
console.log('fullsecret char codes:\n [' + fullsecret.split('').map((x) => { return x.charCodeAt() }).join(', ') + ']');
console.log('hexdigest: ' + hexdigest);
该代码输出以下内容:
digest: ȣ�P��r�l������
fullsecret: È£øP¶r¼l¸¨Æ:241d4105fe8f60cef84524f6:7db4c8275fb38f94774c1fe7
fullsecret char codes:
[200, 163, 248, 16, 80, 182, 139, 114, 188, 108, 184, 141, 136, 168, 130, 198, 58, 50, 52, 49, 100, 52, 49, 48, 53, 102, 101, 56, 102, 54, 48, 99, 101, 102, 56, 52, 53, 50, 52, 102, 54, 58, 55, 100, 98, 52, 99, 56, 50, 55, 53, 102, 98, 51, 56, 102, 57, 52, 55, 55, 52, 99, 49, 102, 101, 55]
hexdigest: 5deef0b84014693b745ea40b047f4ae8
我认为问题出在缓冲区(摘要变量)的字符串转换上,但我还没有找到纠正此问题的方法。我什至尝试过从 here 中提取相关代码(从第 178 行开始)但这给了我另一个十六进制摘要(从我读到的内容来看,“二进制”编码已被弃用),使用以下代码:
function md5(str, encoding){
return crypto
.createHash('md5')
.update(str)
.digest(encoding || 'hex');
}
var hexdigest = md5(md5(secret, 'binary') + ':' + nonce + ':' + cnonce);
console.log('hexdigest: ' + hexdigest);
打印出:
hexdigest: 5deef0b84014693b745ea40b047f4ae8
第一个问题:有谁知道为什么会发生这种情况和/或知道如何让它发挥作用?
第二个问题:有没有更好的方法将Python代码移植到NodeJS?
我目前使用的是 NodeJS 7.6.0。我感谢任何能够帮助阐明这一点的人,我已经花了很长时间在键盘上敲打我的头。
更新:2017/04/05
睡了一觉之后......事实证明我确实需要使用 .digest('binary') 来获得正确的摘要。当比较 fullsecret 字符代码时,如果我不使用 .digest('binary'),Python 和 JS 之间会有所不同。但是,现在 fullsecret 字符串包含来自 Python 和 JS 的相同 字符代码,JS 中的最后一个十六进制摘要部分出现问题...上面的代码和输出已被修改以反射(reflect)更改。
最佳答案
最好避免将字节表示为字符串。 Node 具有用于此目的的 Buffer
类型:
var crypto = require('crypto');
var username = 'username';
var password = 'password';
var nonce = Buffer.from('241d4105fe8f60cef84524f6');
var cnonce = Buffer.from('7db4c8275fb38f94774c1fe7');
var secret = username + ':my realm:' + password;
var digest = crypto.createHash('md5').update(secret).digest();
var fullsecret = Buffer.concat([digest, Buffer.from(':'), nonce, Buffer.from(':'), cnonce]);
var hexdigest = crypto.createHash('md5').update(fullsecret).digest('hex');
console.log('digest: ' + digest);
console.log('digest char codes: [' + digest.join(', ') + ']');
console.log('fullsecret: ' + fullsecret);
console.log('fullsecret char codes:\n [' + fullsecret.join(', ') + ']');
console.log('hexdigest: ' + hexdigest);
注意 Buffer.from()
将 ASCII 字符串编码为字节,Buffer.concat
用于连接缓冲区,以及 .digest()
不带编码参数来生成缓冲区而不是字符串。
关于javascript - 尝试在 NodeJS 中复制 Python DIGEST-MD5 哈希函数时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43218857/
如何将最初使用 Digest::MD5.digest('abc') 编码的哈希字符串转换为以下格式的十六进制字符串 Digest::MD5.hexdigest(' abc')?不同之处在于,十六进制字
我正在尝试制作一个应用程序,用户可以在其中将音乐上传、下载和流式传输到 Amazon Web Services、Simple Storage Services (AWS-S3)。 我试图解决的一个问题
每当我运行测试或启动 Rails 服务器时,我都会收到此警告。 当我从 .rvm 文件夹运行 grep 时,我看到以下内容: grep -R 'Digest::Digest' . ./rubies/r
我收到以下错误 Digest::Digest is deprecated; use Digest 当我尝试启动我的 Rails 服务器时。我试图在我的源代码中搜索 Digest::Digest 但我没
我在解决这个问题时遇到了一些麻烦。我正在尝试编写一个通用函数,它可以接受任何 digest::Digest并吐出计算摘要的字符串形式(“十六进制字符串”)。 这是the non-generic ver
当我尝试使用我的应用程序启动 Tomcat6 时(我正在尝试从 Tomcat7 移植到 Tomcat6),我遇到了一个奇怪的解析问题。 Digester 本身不会声明错误,直到遇到意外的文件结尾 -
使用 Digest::SHA 有什么优势吗?超过Digest::SHA1或相反亦然?两者似乎都得到了维护,但我不认为 Digest::SHA1 与 Digest::SHA 一起存在的原因。 最佳答案
例如。当我用每个函数计算哈希时,我得到不同的结果。 PKI::PKI.digest("hola", "MD5") digest::digest("hola", "md5") 最佳答案 对摘要使用ser
在 AngularJS 范围内,$apply() 在每个事件处理程序(输入指令的 keydown/input 事件,选择指令的更改事件等)和其他一些情况下被调用。 见 small example .尽
我将从这个 XML/RDF 中提取值: Church of S. Giuda Taddeo or S. Onofrio - Gaeta Chiesa S. Giuda Taddeo
我得到java.lang.NoClassDefFoundError: org/apache/commons/digester/Digester 错误,我被这个错误困扰了一个多月。我已经尝试了所有可用的
我正在为客户提供一个片段,以粘贴到他们引用我的 application.js 文件的静态 html 中。 因为它位于我无法控制的页面上,而且我不想在每次发布时都要求客户更新他们的代码片段,所以我想知道
我正在尝试在 Linux 中使用 curl 更改基于 Onvif 的相机的日期。我已经在 c# 中成功完成并使用摘要身份验证,但我被困在这种情况下。 我正在使用以下命令: curl -u "admin
我正在尝试通过 Eclipse ide 生成 jasper 报告,但是当我执行以下代码行时: jasperReport = JasperCompileManager.compileReport("re
我目前正在学习 Michael Hardtl 的 Rails 教程,在第 7 章中有一段以 require 'digest' 开头的代码。 .我跑sudo gem install digest并得到无
我有一个 perl 脚本,它使用 Digest::MD5 md5($data) 来获取 16 字节摘要(以不可读的形式 - 二进制),并且该摘要用于加密数据。现在我必须在 java 中反转上述过程,即
我使用 $http.get() 获取数据并将其作为参数传递给自定义过滤器以获取过滤数据。但它正在给予错误:$digest 已在进行中。 有谁知道如何避免此错误或以不同的方式实现相同的目标? var m
除了以纯文本形式发送凭据之外,摘要式身份验证与基本身份验证有何不同? 最佳答案 主要区别在于它不需要以明文方式通过网络发送用户名和密码。它也不受重放攻击的影响,因为它使用来自服务器的一次性号码。 服务
在签名的 apk 中,会有一个 META-INF/MANIFEST.MF 文件。在这个文件中,我们可以找到像这样的摘要: Name: res/layout/main.xml SHA1-Digest:
我是这个论坛的新手。乍一看,这个社区看起来棒极了。我有一个简单的问题。我正在使用 log4j 进行记录并且是 tomcat 的新手。我找到了设置日志规则的文件,文件名:server.log4j-con
我是一名优秀的程序员,十分优秀!