从字符串转换为字节时 md5 函数使用什么编码
what encoding does the md5 function use when converting from string to bytes
在php中调用md5
方法并传递一个字符串作为参数时,我猜测php必须将字符串转换为字节才能执行哈希操作,什么从字符串转换为字节时使用编码吗?
我正在尝试将以下 php 代码移植到 .net 代码中。
.net 不能先对字符串进行 Hash,它必须转换为字节数组或流。
<?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
}
?>
PHP 字符串不是 "encoded",它们更像是字节数组。程序员有责任确保代码没有做一些愚蠢的事情(比如连接 UTF-8 字符串和 ISO-8859 或使用 unicode 函数和非 unicode 字符串)。通常它会让事情变得困难,但至少你知道 md5
将要编码的内容:它完全取决于字符串的来源(
数据库驱动程序的设置,托管 $_REQUEST
值等形式的页面的编码等)。
md5
函数定义在
- https://github.com/php/php-src/blob/master/ext/standard/md5.c 和
- https://github.com/php/php-src/blob/master/ext/standard/md5.h
它使用这个 Public 域实现:
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] = '[=10=]';
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);
在php中调用md5
方法并传递一个字符串作为参数时,我猜测php必须将字符串转换为字节才能执行哈希操作,什么从字符串转换为字节时使用编码吗?
我正在尝试将以下 php 代码移植到 .net 代码中。
.net 不能先对字符串进行 Hash,它必须转换为字节数组或流。
<?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
}
?>
PHP 字符串不是 "encoded",它们更像是字节数组。程序员有责任确保代码没有做一些愚蠢的事情(比如连接 UTF-8 字符串和 ISO-8859 或使用 unicode 函数和非 unicode 字符串)。通常它会让事情变得困难,但至少你知道 md5
将要编码的内容:它完全取决于字符串的来源(
数据库驱动程序的设置,托管 $_REQUEST
值等形式的页面的编码等)。
md5
函数定义在
- https://github.com/php/php-src/blob/master/ext/standard/md5.c 和
- https://github.com/php/php-src/blob/master/ext/standard/md5.h
它使用这个 Public 域实现:
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] = '[=10=]';
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);