2012-07-08 39 views
4

我有一個PHP應用程序,其密碼存儲在數據庫中作爲sha1($ password)的輸出,顯然是二進制SHA1哈希的十六進制表示。 (據我的理解)在PERL中將SHA1十六進制轉換爲base64編碼(對於Apache htpasswd)

我想將其轉換爲與Apache .htpassword文件兼容的格式,該文件需要base64編碼的二進制值或base64_encode的輸出(sha1($ password,true) )。

我發現此線程:Convert base64'd SHA1 hashes to Hex hashes ...這是做我需要做的相反,它的作品很好。我試圖改變指令的順序,而不是使用BIN2HEX HEX2BIN,但是,這並不工作:

致命錯誤:調用未定義的函數HEX2BIN()在PHP shell代碼第1行

顯然是不可用,直到PHP 5.4,而這個服務器仍然在5.3.x http://php.net/manual/en/function.hex2bin.php

這裏是真正的問題。我實際上需要它在PERL轉換,最好只使用標準內置模塊,以保持一切簡單。我不確定他們爲什麼在這一步使用perl,但我正在編輯一個更大的應用程序的一個很小的一部分,並且不想改變整個東西:)

要清楚,我是不是試圖將十六進制數字轉換爲二進制數字。這是一個二進制值的十六進制表示,存儲在一個Perl「串」 :)

由於提前, 湯米

回答

6

你解釋那麼多,但仍留下我不確定你想要什麼:/

如果你想要的是從十六進制字符串轉換爲二進制大對象爲Base64字符串,這是你說的話,你在你的問題的頂部的段落想,

use MIME::Base64; 
my $bin = pack "H*", $hex_str; 
my $encoded = encode_base64($bin); 

它完全匹配你想要什麼: base64_encode(sha1($ password,tru e))

忽略我以前的答案和編輯。

+0

哇,謝謝!完善!我已經測試瞭解決方案,看起來不錯。我會執行它,看看它是如何工作的(或者它是否被上游接受);) 編輯:當他們讓我給我投票:) – TommyTheKid 2012-07-08 13:26:54

+0

對於它的價值,我也必須使用'chomp($ encoded )'擺脫一個額外的換行符,但它的工作,這裏是[結果](https://github.com/TJM/nconf/compare/HandleApacheSHA1)...不知道它將持續多久作爲鏈接tho :) – TommyTheKid 2012-07-08 15:02:40

+0

呃..我從來沒有注意到encode_base64添加了一個換行符。我們都學到了什麼。 – 2012-07-09 09:31:21