Hướng dẫn dùng sha256 length trong PHP

Như Johannes Gorset đã chỉ ra, bài đăng của Thomas Ptacek từ Matasano Security giải thích tại sao các hàm băm đơn giản, đa năng như MD5, SHA1, SHA256 và SHA512 là những lựa chọn băm mật khẩu kém .

Tại sao? Chúng quá nhanh - bạn có thể tính toán ít nhất 1.000.000 MD5 băm một giây trên một lõi với một máy tính hiện đại, do đó, sức mạnh vũ phu là khả thi đối với hầu hết mật khẩu mọi người sử dụng. Và đó là ít hơn nhiều so với một cụm máy chủ bẻ khóa dựa trên GPU!

Ướp muối mà không kéo dài khóa chỉ có nghĩa là bạn không thể tính toán trước bảng cầu vồng, bạn cần xây dựng nó một cách đặc biệt cho loại muối cụ thể đó. Nhưng nó sẽ không thực sự làm cho mọi thứ khó khăn hơn nhiều.

Người dùng @Will nói:

Mọi người đang nói về điều này giống như họ có thể bị hack qua internet. Như đã nêu, việc giới hạn các nỗ lực khiến không thể bẻ khóa mật khẩu qua Internet và không liên quan gì đến hàm băm.

Họ không cần. Rõ ràng, trong trường hợp LinkedIn, họ đã sử dụng lỗ hổng SQL tiêm phổ biến để lấy bảng DB đăng nhập và bẻ khóa hàng triệu mật khẩu ngoại tuyến.

Sau đó, anh ta quay lại kịch bản tấn công ngoại tuyến:

Bảo mật thực sự phát huy tác dụng khi toàn bộ cơ sở dữ liệu bị xâm phạm và sau đó một hacker có thể thực hiện 100 triệu lần thử mật khẩu mỗi giây so với băm md5. SHA512 chậm hơn khoảng 10.000 lần.

Không, SHA512 không chậm hơn 10000 lần so với MD5 - nó chỉ mất khoảng gấp đôi. Mặt khác, Crypt / SHA512 là một quái thú rất khác, giống như đối tác BCrypt của nó, thực hiện việc kéo dài khóa , tạo ra một hàm băm rất khác với một muối ngẫu nhiên tích hợp và sẽ mất khoảng 500 đến 999999 lần để tính toán (kéo dài là điều chỉnh).

SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

Vì vậy, sự lựa chọn cho PHP là Crypt / Blowfish (BCrypt), Crypt / SHA256 hoặc Crypt / SHA512. Hoặc ít nhất là Tiền điện tử / MD5 (PHK). Xem www.php.net/manual/en/feft.crypt.php

14 hữu ích 5 bình luận chia sẻ

Có cách nào để tạo chữ ký HmacSHA256 của một chuỗi trong php không?

Nội dung chính

  • Đăng nhập để trả lời câu hỏi
  • Có thể bạn quan tâm
  • Đăng nhập để trả lời câu hỏi
  • Có thể bạn quan tâm
  • Not the answer you're looking for? Browse other questions tagged c# php hashcode or ask your own question.

  • php
  • hmac

49 hữu ích 0 bình luận 75k xem chia sẻ

answer

103

Sử dụng hash_hmac:

$sig = hash_hmac('sha256', $string, $secret)

$secretChìa khóa của bạn ở đâu .

103 hữu ích 5 bình luận chia sẻ

answer

16

Các hash_hmac()chức năng có thể giúp đỡ, ở đây:

Tạo giá trị băm có khóa bằng phương pháp HMAC


Ví dụ: phần mã sau:

$hash = hash_hmac('sha256', 'hello, world!', 'mykey');
var_dump($hash);

Cung cấp đầu ra sau:

string '07a932dd17adc59b49561f33980ec5254688a41f133b8a26e76c611073ade89b' (length=64)


Và, để có được danh sách các thuật toán băm có thể được sử dụng, hãy xem hash_algos().

16 hữu ích 0 bình luận chia sẻ

answer

8

Đây là một ví dụ về ký kết giao dịch datatrans (giải pháp thanh toán điện tử của Thụy Sĩ) trước khi gọi PSP với HMAC-SHA-256 .

Hy vọng nó có thể giúp một số nhà phát triển.

$hmacKey    = 30911337928580013;

$merchantId = 1100004624;
$amount     = $total * 100;
$currency   = 'EUR';
$refno      = $orderId;

// HMAC Hex to byte
$secret     = hex2bin("$hmacKey");

// Concat infos
$string     = $merchantId . $amount. $currency . $refno;

// generate SIGN
$sign       = bin2hex(hash_hmac('sha256', $string, $secret)); 

Lưu ý: ID người bán và khóa HMAC đều lấy từ tài liệu Datatrans có sẵn tại đây: https://admin.sandbox.datatrans.com/showcase/doc/Technical_Implementation_Guide.pdf

8 hữu ích 3 bình luận chia sẻ

answer

0

Tôi không thể trả lời do thiếu danh tiếng, nhưng cách @Melomans kết hợp với câu trả lời của ZPiDER dẫn đến việc chỉ sử dụng

$hash       = hash_hmac('sha256', $string, $secret);

để ký Datatrans chính xác

0 hữu ích 0 bình luận chia sẻ

Đăng nhập để trả lời câu hỏi

Có thể bạn quan tâm

Có cách nào để tạo chữ ký HmacSHA256 của một chuỗi trong php không?

Nội dung chính

  • Đăng nhập để trả lời câu hỏi
  • Có thể bạn quan tâm
  • Not the answer you're looking for? Browse other questions tagged c# php hashcode or ask your own question.
  • php
  • hmac

49 hữu ích 0 bình luận 75k xem chia sẻ

answer

103

Sử dụng hash_hmac:

$sig = hash_hmac('sha256', $string, $secret)

$secretChìa khóa của bạn ở đâu .

103 hữu ích 5 bình luận chia sẻ

answer

16

Các hash_hmac()chức năng có thể giúp đỡ, ở đây:

Tạo giá trị băm có khóa bằng phương pháp HMAC


Ví dụ: phần mã sau:

$hash = hash_hmac('sha256', 'hello, world!', 'mykey');
var_dump($hash);

Cung cấp đầu ra sau:

string '07a932dd17adc59b49561f33980ec5254688a41f133b8a26e76c611073ade89b' (length=64)


Và, để có được danh sách các thuật toán băm có thể được sử dụng, hãy xem hash_algos().

16 hữu ích 0 bình luận chia sẻ

answer

8

Đây là một ví dụ về ký kết giao dịch datatrans (giải pháp thanh toán điện tử của Thụy Sĩ) trước khi gọi PSP với HMAC-SHA-256 .

Hy vọng nó có thể giúp một số nhà phát triển.

$hmacKey    = 30911337928580013;

$merchantId = 1100004624;
$amount     = $total * 100;
$currency   = 'EUR';
$refno      = $orderId;

// HMAC Hex to byte
$secret     = hex2bin("$hmacKey");

// Concat infos
$string     = $merchantId . $amount. $currency . $refno;

// generate SIGN
$sign       = bin2hex(hash_hmac('sha256', $string, $secret)); 

Lưu ý: ID người bán và khóa HMAC đều lấy từ tài liệu Datatrans có sẵn tại đây: https://admin.sandbox.datatrans.com/showcase/doc/Technical_Implementation_Guide.pdf

8 hữu ích 3 bình luận chia sẻ

answer

0

Tôi không thể trả lời do thiếu danh tiếng, nhưng cách @Melomans kết hợp với câu trả lời của ZPiDER dẫn đến việc chỉ sử dụng

$hash       = hash_hmac('sha256', $string, $secret);

để ký Datatrans chính xác

0 hữu ích 0 bình luận chia sẻ

Đăng nhập để trả lời câu hỏi

Có thể bạn quan tâm

sử dụng .NET và C #, tôi cần cung cấp một chuỗi toàn vẹn bằng HMAC SHA512 cho máy chủ PHP. Sử dụng trong C #:

Encoding encoding = Encoding.UTF8;
byte[] keyByte = encoding.GetBytes(key);
HMACSHA512 hmacsha512 = new HMACSHA512(keyByte);
byte[] messageBytes = encoding.GetBytes(message);
byte[]  hashmessage = hmacsha512.ComputeHash(messageBytes);
return(ByteToString(hashmessage).toUpper());

Nhưng nó không khớp với mã PHP hash_hmac () PHP:

$hmac = strtoupper(hash_hmac($pbx_hash, $msg, $binKey));

Tôi cố gắng thay đổi mã hóa trong C # (utf8, ASCII, Unicode) mà không thành công.

Tôi đã thử nhiều giải pháp được tìm thấy trên mạng nhưng không có gì cung cấp cùng một chuỗi :(

Tôi không thể thay đổi mã PHP và không thấy có gì sai trong C #

Chỉnh sửa Đây là ByteToString(sao chép từ nhận xét):

static string ByteToString(byte[] buff)
{
    string sbinary = "";
    for (int i = 0; i < buff.Length; i++)
    {
        sbinary += buff[i].ToString("X2"); /* hex format */
    }
    return (sbinary);
}    

Sau nhiều lần tets, tôi nhận thấy rằng tôi nhận được kết quả tương tự nếu khóa băm PHP_hmac là một chuỗi, không phải là một Mảng byte. Có vẻ như vấn đề là với hàm chuyển đổi PHP $ binKey = pack ("H *", $ keyTest);

29 hữu ích 3 bình luận 27k xem chia sẻ

this is my PHP code:

hash_hmac( "sha256", utf8_encode( $filename ), utf8_encode( $password ) );

and this is my C# code:

var hmacsha256 = new HMACSHA256( Encoding.UTF8.GetBytes( password ) );
hmacsha256.ComputeHash( Encoding.UTF8.GetBytes( filename ) );

unfortunately both results differ. Can anyone give me a hint?

asked Mar 30, 2009 at 21:11

tanasciustanascius

52.1k21 gold badges111 silver badges133 bronze badges

My C# is not the best but i got it to work, what you need to do is to convert your byte array results to hex.

PHP

$hash = hash_hmac( "sha256", utf8_encode("Filename"), utf8_encode("Password"));
echo $hash;
// 5fe2ae06ff9828b33fe304545289a3f590bfd948ca9ab731c980379992ef41f1

C#

string password = "Password";
string filename = "Filename";

var hmacsha256 = new HMACSHA256(Encoding.UTF8.GetBytes(password));
hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(filename));

foreach(byte test in hmacsha256.Hash)
{
    Console.Write(test.ToString("X2"));
}
// 5FE2AE06FF9828B33FE304545289A3F590BFD948CA9AB731C980379992EF41F1

answered Mar 30, 2009 at 23:07

Ólafur WaageÓlafur Waage

67.2k19 gold badges140 silver badges194 bronze badges

1

Not the answer you're looking for? Browse other questions tagged c# php hashcode or ask your own question.