Ruby和JavaScript之间MD5的不同值

Ruby和JavaScript之间MD5的不同值,javascript,ruby,encoding,cryptography,md5,Javascript,Ruby,Encoding,Cryptography,Md5,我需要能够在客户端JavaScript应用程序中的同一个文件上以及使用Ruby的服务器上运行MD5哈希 目前,我无法使两个哈希值相同 在客户机上,我使用将文件上载到S3存储桶。我正在使用在回调中哈希文件: file = data.files[0] filename = file.name; md5 = CryptoJS.MD5(CryptoJS.enc.Hex.parse(data.files[0].toString())); 这给了我:ee9cd5bf4272fc35bd57d184553

我需要能够在客户端JavaScript应用程序中的同一个文件上以及使用Ruby的服务器上运行MD5哈希

目前,我无法使两个哈希值相同

在客户机上,我使用将文件上载到S3存储桶。我正在使用在回调中哈希文件:

file =  data.files[0]
filename = file.name;
md5 = CryptoJS.MD5(CryptoJS.enc.Hex.parse(data.files[0].toString()));
这给了我:ee9cd5bf4272fc35bd57d184553bd25b

在Ruby中,它是一个模块,由执行哈希运算的Gem使用:

Digest::MD5.file(file).to_s
这给了我:4d51c9a4d3fd076489d6c96614ebce61

我无法控制Ruby方面的事情,但是为什么Crypto生成的校验和会有所不同呢?

请注意,我可以使用相同的API在本地进行测试:

path = 'path/to/file.jpg'
Digest::MD5.file(f).hexdigest
# 4d51c9a4d3fd076489d6c96614ebce61
该文件是一个大jpg(~1.8meg)

更新:针对@kxyz的回答,使用不同的加密js编码器的结果如下:

CryptoJS.MD5(CryptoJS.enc.Hex.parse(data.files[0].toString()));
// ee9cd5bf4272fc35bd57d184553bd25b

CryptoJS.MD5(CryptoJS.enc.Utf8.parse(data.files[0].toString()));
// 709d1d31dc47636e4f5ccbfd07601c19

CryptoJS.MD5(CryptoJS.enc.Latin1.parse(data.files[0].toString()));
// 709d1d31dc47636e4f5ccbfd07601c19
我还使用bash
md5
检查了原始文件和从S3下载的复制文件,这两个文件生成了相同的哈希:

4d51c9a4d3fd076489d6c96614ebce61与Ruby生成的哈希相同

还使用以下命令检查哈希:


4d51c9a4d3fd076489d6c96614ebce61

您使用
CryptoJS.enc.Latin1
,在Ruby中您不定义编码
摘要::MD5.file(file).to_
。确保使用相同的编码

试一试


data.files[0].toString()
没有执行您认为它正在执行的操作。它只返回一个“[对象文件]”字符串,而不是文件的内容

您实际上需要读取文件,例如:

var reader=newfilereader();
reader.onload=函数(e){
var内容=e.target.result;
var hash=CryptoJS.MD5(内容);
console.log(散列);
log(hash.toString(CryptoJS.enc.Base64));
};
//作为数据URL读入图像文件。
reader.readAsBinaryString(data.files[0]);

CryptoJS.MD5()
的输出是原生CryptoJS二进制数组(
WordArray
)。当打印为字符串时,默认情况下会序列化为十六进制编码。如果需要另一种编码,则需要将其传递到它的
toString()
函数中。

我在使用的web主机上遇到了类似的问题。结果是上传的文件数据被关闭了几个字符,这导致md5不匹配,Rails在删除上传的文件后发出422响应

如果您发现自己处于同样的情况,以下是解决方法:


#app/controllers/upload_controller.rb您确定两种情况下的输入相同吗?可能输入的编码方式不同,或者在一种情况下,前导或尾随空格被去除,而在另一种情况下,前导或尾随空格被去除。@Jordan文件是jpg。我可以同时获取原始和复制两个文件,并对它们运行(ruby)MD5哈希,这是完全相同的。您能否将您的示例简化为clean ruby方法调用(请参阅ruby gem内部的方法调用)?@aratak我已经添加了ruby。这是一个普通的Ruby模块。谢谢你的回答。我已经切换到使用Hex:
CryptoJS.enc.Hex
,但这也给了我错误的哈希值。我已经更新了这个问题。从十六进制解析“foobar”没有意义,因为它不是十六进制。您可能是指
CryptoJS.MD5('foobar').toString(CryptoJS.enc.Hex)谢谢。但是哈希都是一样的,不管是使用
CryptoJS.enc.Base64
还是其他方法。
Digest::MD5.hexdigest('foobar')
CryptoJS.MD5(CryptoJS.enc.Hex.parse('foobar'));