md5函数在从字符串转换为字节时使用的编码

时间:2017-03-09 07:25:55

标签: php encoding md5

在php中调用md5方法并传递字符串作为参数时,我猜想php必须将字符串转换为字节才能执行散列操作,从字符串转换为字节时它使用什么编码?

我试图将以下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    
}
?>

2 个答案:

答案 0 :(得分:3)

PHP字符串不是&#34;编码&#34;,它们更像字节数组。程序员有责任确保代码不会做一些愚蠢的事情(比如连接UTF-8字符串和ISO-8859或使用unicode函数和非unicode字符串)。通常它会让事情变得困难,但至少你确切知道md5将要编码的内容:它完全取决于字符串的来源( 数据库驱动程序的设置,托管$_REQUEST值表单的页面的编码等。)。

答案 1 :(得分: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);