【问题标题】:What is causing my md5 hash to come out incorrectly?是什么导致我的 md5 哈希输出不正确?
【发布时间】:2016-08-24 01:04:05
【问题描述】:
#!/bin/bash

# Program's Purpose: Compute time elapsed between epoch time and current time
# Produce an MD5 hash from that time
# Get code from that hash

# compute time elapsed in seconds between epoch time and current time
#EPOCH=$(date -u -d '2001-02-03 04:05:06' '+%F %H:%M:%S')
#CURRENT=$(date -u -d '2010-06-13 12:55:34' '+%F %H:%M:%S')
# code: dd15
EPOCH=$(date -u -d '1999-12-31 23:59:59' '+%F %H:%M:%S')
CURRENT=$(date -u -d '2013-05-06 07:43:25' '+%F %H:%M:%S')
# interval is time elapsed minus time elapsed % 60

echo $EPOCH
echo $CURRENT
read YEAR1 M1 DAY1 HOUR1 MIN1 SEC1 <<< "${EPOCH//[:-]/ }" 
read YEAR2 M2 DAY2 HOUR2 MIN2 SEC2 <<< "${CURRENT//[:-]/ }"
echo $YEAR1 $M1 $DAY1 $HOUR1 $MIN1 $SEC1 

# date in seconds from 
sec1=$(date -d "$EPOCH" -u +%s)
sec2=$(date -d "$CURRENT" -u +%s)
echo $sec1
echo $sec2

# get the difference from the two times
difference=$((sec2 - sec1))
difference=$((difference - ((difference % 60))))
echo $difference

# get the hash from the time
hash=$(echo -n $difference | md5sum | tr -d '\n')
hash=$(echo -n $hash | md5sum | tr -d '\n')
echo $hash

# creating two strings, one with all of the letters
# the other with all of the numbers
letter=$(echo $hash | sed 's/[0-9]*//g' | cut -c1-2)
echo $letter
num=$(echo $hash | sed 's/[^0-9]*//g')
echo $num
#num=$(echo $num | cut -c1-2)
#echo $num

# getting the last two numbers in reverse order
num1=$(echo ${num: -1})
num=$(echo "${num::-1}")
echo $num
num2=$(echo ${num: -1})
code="$letter$num1$num2"
echo $code

我正在尝试编写一个需要一个纪元时间的程序,并且 当前时间,以秒为单位计算差异,然后创建一个 通过对时间进行双重 md5 哈希(以秒为单位)来编写代码。几点钟 我目前已经进入,秒差应该是421, 141、406,并且“代码”应该基于 60 秒 间隔,所以我试图生成的代码应该来自 421, 141、380。

生成的哈希应该是 042876ca07cb2d993601fb40a1525736,但我得到了 d49904f9e7e62d0ff16e523d89be08eb。谁能告诉我我在做什么 到底错了吗?

我读到 bash 在末尾留下一个换行符 字符串,所以我使用 -n 选项运行 echo 以删除该换行符,但我是 仍然没有得到首选的结果。

【问题讨论】:

  • 你为什么要运行md5sum 两次?另外,什么 String 会产生您预期的输出?
  • 这是赋值的一部分,我们被告知 md5 (md5 (difference)),所以写为 'difference' 的变量回显到 md5 中,然后我将 'hash' 设置为md5 的差异。
  • 哪个最终数字应该产生预期的哈希?
  • 421141380 是插入以产生哈希的数字

标签: bash encryption hash md5 md5sum


【解决方案1】:

md5sum 在许多平台上的输出不只是 MD5 总和。例如,在 GNU/Linux 系统上,您会得到

debian$ echo -n 401 | md5sum
816b112c6105b3ebd537828a39af4818  -

请注意,输出有两个字段:实际的 MD5 总和,后跟两个空格,然后是输入文件名(其中 - 代表标准输入)。

(相比之下,在 OSX 上,我希望大多数 *BSD,你会得到

yosemite$ echo -n 401 | md5
816b112c6105b3ebd537828a39af4818

在这里,您会注意到 MD5 实用程序的名称不同。)

修复应该很简单。我已将您的代码重构为 (a) 更喜欢可移植的 printf 而不是可移植性较差的 echo -n(b) 删除完全多余的结尾tr -d '\n'(shell 已经从捕获的变量的末尾修剪了换行符);和 (c) 将所有内容折叠到一个管道中。

hash=$(printf '%s' "$difference" | md5sum | cut -d ' ' -f 1 | tr -d '\n' |
    md5sum | cut -d ' ' -f 1)
echo "$hash"

为了完整起见,这段代码也有适当的引用;这不是绝对必要的(例如,如果您真的需要保留最初从 md5sum 获得的值中的间距,则应该这样做)但是省略引号是一个常见的新手问题,应该避免。

(捕获一个变量只是为了让您可以echo 这也是一个常见的新手反模式;但是您的代码随后会想要使用变量hash。)

重复的代码总是难闻的;可能提供与 *BSD md5 实用程序执行相同工作的函数;

md5 () { md5sum "$@" | cut -d ' ' -f 1; }
hash=$(printf '%s' "$difference" | md5 | tr -d '\n' | md5)

【讨论】:

  • 哇,非常感谢!感谢您的所有解释和建议。你真的帮了我很大的忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2021-10-20
  • 1970-01-01
  • 2012-08-17
相关资源
最近更新 更多