Hướng dẫn dùng sha256 encode 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ẻ

Tôi phải xây dựng một hàm băm ủy quyền từ chuỗi này:

Nội dung chính

  • Shell (bash, v.v.) HMAC SHA256
  • ### Delphi HMAC SHA256
  • Đầu tiên, nhập văn bản đơn giản và khóa mật mã để tạo mã. Sau đó, bạn có thể sử dụng Chức năng Chọn hàm băm bạn muốn đăng ký băm. Mặc định là SHA-256. Sau đó, bạn có thể gửi yêu cầu của mình bằng cách nhấp vào nút băm tính để tạo mã xác thực HMAC cho bạn.
  • HMACSHA256 là một loại thuật toán băm khóa được xây dựng từ hàm băm SHA-256 và được sử dụng làm mã xác thực tin nhắn dựa trên băm (HMAC).
  • C# HMAC SHA256
  • Khách quan C và ca cao HMAC SHA256
  • Ngôn ngữ lập trình GO - Golang HMAC SHA256
  • Ruby HMAC SHA256
  • Python (2.7) HMAC SHA256
  • Python (3.7) HMAC SHA256
  • Perl HMAC SHA256
  • DART HMAC SHA256
  • Swift HMAC SHA256
  • PowerShell (Windows) HMAC SHA256
  • Shell (bash, v.v.) HMAC SHA256
  • ### Delphi HMAC SHA256
  • Làm cách nào để giải mã HMAC SHA256?
  • HMAC SHA256 là gì?
  • Sha256 base64 là gì?
  • Sự khác biệt giữa HMAC và SHA là gì?

kki98hkl-u5d0-w96i-62dp-xpmr6xlvfnjz:20151110171858:b2c13532-3416-47d9-8592-a541c208f755:hKSeRD98BHngrNa51Q2IgAXtoZ8oYebgY4vQHEYjlmzN9KSbAVTRvQkUPsjOGu4F

Bí mật này được sử dụng cho hàm băm HMAC:

LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=

Hash ủy quyền tôi phải tạo là:

P-WgZ8CqV51aI-3TncZj5CpSZh98PjZTYxrvxkmQYmI=

Có một số điều cần chăm sóc:

  1. Chữ ký phải được xây dựng với HMAC-SHA-256 như được chỉ định trong RFC 2104.
  2. Chữ ký phải được mã hóa với tương thích URL Base64 như được chỉ định trong RFC 4648 Phần 5 (bảng chữ cái an toàn).

Ngoài ra còn có một số mã giả được đưa ra cho thế hệ:

Signatur(Request) = new String(encodeBase64URLCompatible(HMAC-SHA-256(getBytes(Z, "UTF-8"), decodeBase64URLCompatible(getBytes(S, "UTF-8")))), "UTF-8")

Tôi đã thử nhiều thứ khác nhau trong PHP nhưng chưa tìm thấy thuật toán chính xác. Đây là mã tôi có bây giờ:

if(!function_exists('base64url_encode')){
    function base64url_encode($data) {
        $data = str_replace(array('+', '/'), array('-', '_'), base64_encode($data));
        return $data;
    }
}

$str = "kki98hkl-u5d0-w96i-62dp-xpmr6xlvfnjz:20151110171858:b2c13532-3416-47d9-8592-a541c208f755:hKSeRD98BHngrNa51Q2IgAXtoZ8oYebgY4vQHEYjlmzN9KSbAVTRvQkUPsjOGu4F";
$sec = "LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=";
$signature = mhash(MHASH_SHA256, $str, $sec);
$signature = base64url_encode($signature);

if($signature != "P-WgZ8CqV51aI-3TncZj5CpSZh98PjZTYxrvxkmQYmI=")
    echo "wrong: $signature";
else
    echo "correct";

Nó cho chữ ký này:

K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=

Như bạn có thể thấy, độ dài của 44 ký tự là chính xác. Xin hãy giúp tôi tìm ra sai lầm, vấn đề đơn giản này mất hàng giờ và không có giải pháp nào.

21 tháng 10 năm 2012

Gần đây tôi đã trải qua quá trình tạo SDK cho API trong nhà. API yêu cầu ký vào mọi yêu cầu REST với chữ ký HMAC SHA256. Những chữ ký đó sau đó cần phải được chuyển đổi thành base64. & NBSP; Amazon S3 sử dụng chuỗi Base64 cho băm của họ. & NBSP; Có một số lý do chính đáng để sử dụng mã hóa Base64. Xem & nbsp; Câu hỏi StackOverflow Việc sử dụng mã hóa cơ sở 64 là gì?

Dưới đây là một số giải pháp HMAC SHA 256 đơn giản hóa. Tất cả chúng nên đầu ra

P-WgZ8CqV51aI-3TncZj5CpSZh98PjZTYxrvxkmQYmI=
0 với các giá trị của
P-WgZ8CqV51aI-3TncZj5CpSZh98PjZTYxrvxkmQYmI=
1 và
P-WgZ8CqV51aI-3TncZj5CpSZh98PjZTYxrvxkmQYmI=
2. Hãy chú ý đến thủ đô M. Thông điệp băm là trường hợp nhạy cảm.

Nhảy đến một triển khai:

  • JavaScript
  • PHP
  • Java
  • Groovy
  • C#
  • Mục tiêu c
  • Đi
  • Ruby
  • Python2
  • Python3
  • Perl
  • Phi tiêu
  • Nhanh
  • Rỉ sét
  • Hãy nhìn vào kho lưu trữ ALCO/Rust-Digest để biết Rust (Lang). Tôi chưa xác minh.
  • PowerShell (Windows) HMAC SHA256
  • Chủ yếu là gói thư viện .NET nhưng hữu ích khi thấy nó trong cú pháp phù hợp của PowerShell. Xem mã là ý chính

Shell (bash, v.v.) HMAC SHA256

Sử dụng OpenSSL. Tín dụng cho @CCHECHJIRI

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/hmac-sha256.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/enc-base64.min.js"></script>

<script>
  var hash = CryptoJS.HmacSHA256("Message", "secret");
  var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
  document.write(hashInBase64);
</script>

### Delphi HMAC SHA256

Làm cách nào để giải mã HMAC SHA256?

$s = hash_hmac('sha256', 'Message', 'secret', true);
echo base64_encode($s);

Đầu tiên, nhập văn bản đơn giản và khóa mật mã để tạo mã. Sau đó, bạn có thể sử dụng Chức năng Chọn hàm băm bạn muốn đăng ký băm. Mặc định là SHA-256. Sau đó, bạn có thể gửi yêu cầu của mình bằng cách nhấp vào nút băm tính để tạo mã xác thực HMAC cho bạn.

HMAC SHA256 là gì?

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

public class ApiSecurityExample {
  public static void main(String[] args) {
    try {
     String secret = "secret";
     String message = "Message";

     Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
     SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
     sha256_HMAC.init(secret_key);

     String hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
     System.out.println(hash);
    }
    catch (Exception e){
     System.out.println("Error");
    }
   }
}

HMACSHA256 là một loại thuật toán băm khóa được xây dựng từ hàm băm SHA-256 và được sử dụng làm mã xác thực tin nhắn dựa trên băm (HMAC).

Sha256 base64 là gì?

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;

def hmac_sha256(String secretKey, String data) {
 try {
    Mac mac = Mac.getInstance("HmacSHA256")
    SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256")
    mac.init(secretKeySpec)
    byte[] digest = mac.doFinal(data.getBytes())
    return digest
   } catch (InvalidKeyException e) {
    throw new RuntimeException("Invalid key exception while converting to HMac SHA256")
  }
}

def hash = hmac_sha256("secret", "Message")
encodedData = hash.encodeBase64().toString()
log.info(encodedData)

C# HMAC SHA256

LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
0

Khách quan C và ca cao HMAC SHA256

Hầu hết các mã cần thiết là để chuyển đổi thành BAE64 và làm việc các loại dữ liệu NSString và NSDATA.

LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
1

Ngôn ngữ lập trình GO - Golang HMAC SHA256

  • Hãy thử trực tuyến trong trình duyệt của bạn với Play Golang
  • Gói tiền điện tử/HMAC
LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
2

Ruby HMAC SHA256

Yêu cầu OpenSSL và Base64.

LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
3

Python (2.7) HMAC SHA256

LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
4

Được thử nghiệm với Python 2.7.6. Ngoài ra, hãy chắc chắn không đặt tên cho tập lệnh demo Python của bạn giống như một trong các thư viện đã nhập.

Python (3.7) HMAC SHA256

LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
5

Được thử nghiệm với Python 3.7.0. Ngoài ra, hãy chắc chắn không đặt tên cho tập lệnh demo Python của bạn giống như một trong các thư viện đã nhập. Cảm ơn @biswapanda.

Perl HMAC SHA256

Xem Digest :: Tài liệu SHA. Theo quy ước, các mô -đun tiêu hóa không đệm đầu ra base64 của họ. Để khắc phục điều này, bạn có thể kiểm tra độ dài của băm và nối các dấu hiệu bằng nhau "=" cho đến khi chiều dài là bội số của 4. Chúng tôi sẽ sử dụng hàm mô đun bên dưới.

LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
6

DART HMAC SHA256

Phụ thuộc vào gói tiền điện tử phi tiêu.

LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
7

Swift HMAC SHA256

Tôi chưa xác minh nhưng thấy bài đăng này

Rỉ sét

Hãy nhìn vào kho lưu trữ ALCO/Rust-Digest để biết Rust (Lang). Tôi chưa xác minh.

PowerShell (Windows) HMAC SHA256

Chủ yếu là gói thư viện .NET nhưng hữu ích khi thấy nó trong cú pháp phù hợp của PowerShell. Xem mã là ý chính

LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
8

Shell (bash, v.v.) HMAC SHA256

Sử dụng OpenSSL. Tín dụng cho @CCHECHJIRI

LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
9

### Delphi HMAC SHA256

https://stackoverflow.com/a/40182566/215502

Làm cách nào để giải mã HMAC SHA256?

Đầu tiên, nhập văn bản đơn giản và khóa mật mã để tạo mã.Sau đó, bạn có thể sử dụng Chức năng Chọn hàm băm bạn muốn đăng ký băm.Mặc định là SHA-256.Sau đó, bạn có thể gửi yêu cầu của mình bằng cách nhấp vào nút băm tính để tạo mã xác thực HMAC cho bạn.

HMAC SHA256 là gì?

HMACSHA256 là một loại thuật toán băm khóa được xây dựng từ hàm băm SHA-256 và được sử dụng làm mã xác thực tin nhắn dựa trên băm (HMAC).a type of keyed hash algorithm that is constructed from the SHA-256 hash function and used as a Hash-based Message Authentication Code (HMAC).

Sha256 base64 là gì?

Base64SHA256 tính toán băm SHA256 của một chuỗi đã cho và mã hóa nó bằng base64.Điều này không tương đương với base64encode (SHA256 ("thử nghiệm")) kể từ khi sha256 () trả về biểu diễn thập lục phân.computes the SHA256 hash of a given string and encodes it with Base64. This is not equivalent to base64encode(sha256("test")) since sha256() returns hexadecimal representation.

Sự khác biệt giữa HMAC và SHA là gì?

A: HMAC (Mã xác thực tin nhắn băm) sử dụng SHA-1 trong nội bộ.Sự khác biệt là máy Mac sử dụng khóa bí mật.a MAC uses a secret key.