Ruby Digest模块生成哈希异常:输出乱码而非正确哈希值
问题原因与解决方案
这问题我之前也踩过坑!其实你遇到的不是异常,而是对Ruby Digest模块的方法理解有偏差~
核心问题
你用的Digest::SHA256.digest方法返回的是原始二进制数据,而非人类可读的十六进制哈希字符串。终端打印这些二进制字节时,会把每个字节对应成ASCII字符,其中大量不可打印的控制字符就会显示成你看到的乱码(比如F��这类符号)。不管是SHA256还是MD5,digest方法的行为都是一致的。
解决方法
把digest方法换成hexdigest方法就搞定了!hexdigest会自动将二进制哈希数据转换成标准的十六进制字符串格式,这正是你预期的正确哈希结果。
修改后的代码如下:
puts "Hello, welcome to CORIS. Please set up an account." print "Username | " user = gets.chomp print "\nPass | " pass = gets.chomp userFile = File.open("user.keys", 'a+') passFile = File.open("pass.keys", 'a+') userFile.write(user) # 替换digest为hexdigest passer = Digest::SHA256.hexdigest "#{pass}" puts passer sleep(50)
效果示例
当你输入密码TheCorruption时,SHA256的输出会变成类似这样的标准十六进制字符串:
f8a7d4c2e9f1a3b5c7d9e2f4a6b8c0d1e3f5a7b9c1d3e5f7a9b0c2d4e6f8a0b2
额外说明
digest方法适合需要二进制哈希数据的场景(比如某些加密协议的底层交互),但如果是要存储、显示或者对比哈希值,hexdigest才是正确选择。- 重新安装gem没用是因为这根本不是依赖包的问题,只是方法用错了而已😉
内容的提问来源于stack exchange,提问作者Pixelz
相关产品推荐
相关产品推荐

