在PERL中将SHA1十六进制转换为base64编码(用于Apache htpasswd)

4
我有一个PHP应用程序,其中密码以sha1($ password)的输出形式存储在数据库中,这显然是二进制SHA1哈希的十六进制表示。 (据我所知)
我想将其转换为适用于Apache .htpassword文件的格式,该文件需要是base64编码的二进制值或base64_encode(sha1($ password,true))的输出。
我找到了这个主题:Convert base64'd SHA1 hashes to Hex hashes……它正在执行我需要做的相反操作,并且效果很好。 我尝试更改命令的顺序并使用hex2bin而不是bin2hex,但那行不通:
致命错误:php shell代码中第1行调用未定义的函数hex2bin()
显然,直到PHP 5.4才可用,而此服务器仍在5.3.x上 http://php.net/manual/en/function.hex2bin.php

以下是真正的问题。我需要将其转换为PERL,最好只使用标准内置模块以保持简单性。我不确定为什么他们在这一步中使用perl,但我正在尝试编辑更大应用程序的一个非常小的部分,而不想立即更改整个应用程序 :)

明确一下,我并不是要将十六进制数转换为二进制数。这是一个十六进制表示的二进制值,存储在perl的“字符串”中:)

提前致谢, 汤米

1个回答

6
你解释了很多,但我仍不确定你想要什么:/ 如果你想要将十六进制字符串转换为Blob并生成base64字符串,这是你在问题顶部段落中所说的内容。
use MIME::Base64;
my $bin = pack "H*", $hex_str;
my $encoded = encode_base64($bin);

以下代码可以实现你所需的功能:base64_encode(sha1($password, true))

请忽略我的之前回答和编辑。


哇,谢谢!太棒了!我已经测试了这个解决方案,看起来很不错。我会实施它并看看它的工作情况(或者是否被上游接受);)编辑:当他们让我投票时,我会投赞成票的 :) - TommyTheKid
说句题外话,我也不得不使用 chomp($encoded) 来消除多余的换行符,但它正在工作,并且这是 结果 ... 不确定链接能持续多久 :) - TommyTheKid
哦,我甚至没有注意到 encode_base64 添加了一个换行符。我们都学到了一些东西。 - Jarrod Funnell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接