2017-03-09 31 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); 
相关问题