在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
}
?>
答案 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);