2017-03-09 70 views
2

當調用PHP中的md5方法並傳遞一個字符串作爲參數的時候,我猜想,PHP已經將字符串轉換爲字節進行哈希運算,什麼編碼從字符串轉換爲字節時使用它嗎?什麼編碼做的MD5函數使用從字符串轉換爲字節

我試圖將以下php代碼移植到.net代碼中。

.net無法首先散列字符串,它必須轉換爲字節數組或流。

<?php 
$params = $_GET; 
$var = ""; 
foreach ($params as $key => $value) 
{ 
    if($key != "hash") 
    { 
     $var .= $value; 
    } 
} 
$genstamp = md5($var . "SecretMD5Key"); 
if($genstamp != $_GET["hash"]) 
{ 
    echo "Hash is not valid"; 
    exit(); 
} 
else 
{ 
    //Hash is OK  
} 
?> 
+0

你能寫出一段php代碼片段來指定你所關心的轉換嗎? – pvg

+0

@pvg我加了一些關於這個問題的詳細信息。 – Peter

回答

3

PHP字符串不是「編碼」的,它們更像字節數組。程序員有責任確保代碼不會做一些愚蠢的事情(比如連接UTF-8字符串和ISO-8859或使用unicode函數和非Unicode字符串)。一般來說,使事情變得很難,但至少你知道什麼md5將會編碼:這完全取決於字符串的源(數據庫驅動程序的設置 ,即舉辦了形式$_REQUEST值等頁面的編碼)對。

+0

它們就像字節數組一樣,用於'md5'的目的。一個問題是,源編碼通常不能很好地指定。例如,什麼是PHP字符串文字的編碼? (據我所知,UTF8,但它似乎並不明顯或由文檔保證) – pvg

+0

要回答我的問題'$ _GET'有什麼編碼? – Peter

+0

@Peter無論編碼發件人使用 – Gordon

2

md5功能在

定義它使用這個公共領域的實現:

PHP代碼來調用執行僅僅是這樣的:

/* {{{ proto string md5(string str, [ bool raw_output]) 
    Calculate the md5 hash of a string */ 
PHP_NAMED_FUNCTION(php_if_md5) 
{ 
    zend_string *arg; 
    zend_bool raw_output = 0; 
    char md5str[33]; 
    PHP_MD5_CTX context; 
    unsigned char digest[16]; 

    ZEND_PARSE_PARAMETERS_START(1, 2) 
     Z_PARAM_STR(arg) 
     Z_PARAM_OPTIONAL 
     Z_PARAM_BOOL(raw_output) 
    ZEND_PARSE_PARAMETERS_END(); 

    md5str[0] = '\0'; 
    PHP_MD5Init(&context); 
    PHP_MD5Update(&context, ZSTR_VAL(arg), ZSTR_LEN(arg)); 
    PHP_MD5Final(digest, &context); 
    if (raw_output) { 
     RETURN_STRINGL((char *) digest, 16); 
    } else { 
     make_digest_ex(md5str, digest, 16); 
     RETVAL_STRING(md5str); 
    } 

} 

正如其他地方提到這個頁面上已經,不會有轉換。它會使用任何你從PHP中通過這些來計算MD5哈希值:

PHPAPI void PHP_MD5Init(PHP_MD5_CTX *ctx); 
PHPAPI void PHP_MD5Update(PHP_MD5_CTX *ctx, const void *data, size_t size); 
PHPAPI void PHP_MD5Final(unsigned char *result, PHP_MD5_CTX *ctx); 
相關問題