thắc mắc Thắc mắc về cách mã hoá chuỗi chứa thông tin

K hiểu cái bạn nói lắm. Mật khẩu thường có độ dài ngắn, cấu thành từ những từ nên phải thêm salt vào, sau khi hash thì không dò ngược lại được. Chứ mã hóa thì thêm salt vào cũng đâu có tăng độ khó nhỉ, từ đầu nó đã có độ dài và tính random cao hơn mật khẩu rồi
Thêm salt không phải chỉ vì mật khẩu nó ngắn. mục đích chính vẫn là tăngđộ random để ra 1 chuỗi bất kỳ không đoán được vì kỹ thuật do mật khẩu hiện nay chủ yếu vẫn là vét cạn hoặc so sánh với mẫu có sẵn
Việc thêm salt vào dữ liệu mã hóa vẫn có mục đích chính là tăng độ random của dữ liệu đầu vào nếu muốn dùng vét cạn để dò dữ liệu thì sẽ khó hơn và mất thời gian hơn
 
K hiểu cái bạn nói lắm. Mật khẩu thường có độ dài ngắn, cấu thành từ những từ nên phải thêm salt vào, sau khi hash thì không dò ngược lại được. Chứ mã hóa thì thêm salt vào cũng đâu có tăng độ khó nhỉ, từ đầu nó đã có độ dài và tính random cao hơn mật khẩu rồi

Thêm salt không phải chỉ vì mật khẩu nó ngắn. mục đích chính vẫn là tăngđộ random để ra 1 chuỗi bất kỳ không đoán được vì kỹ thuật do mật khẩu hiện nay chủ yếu vẫn là vét cạn hoặc so sánh với mẫu có sẵn
Việc thêm salt vào dữ liệu mã hóa vẫn có mục đích chính là tăng độ random của dữ liệu đầu vào nếu muốn dùng vét cạn để dò dữ liệu thì sẽ khó hơn và mất thời gian hơn
Theo mình hiểu là như này:
  1. password thì có độ dài ngắn khác nhau. Trong khi key cho các giải thuật mã hóa thì cố đinh như AES128, AES192, AES256. Cho nên key derivation function sinh ra để giải quyết chuyện này. Tức là password thông qua key derivation function sẽ sinh ra key để mã hóa.
  2. giống như @toant8 nói, thì mục đích thêm salt để tránh việc bị tấn công bằng brute-force,... Giả sử nếu không có salt, thì với mỗi password thì sẽ chỉ sinh ra được một key cố định. Do đó ngta bổ sung thêm salt, là thành phần được sinh ra ngẫu nhiên tại một lần mã hóa. Tức là với chỉ với một password thì sẽ sinh ra các key khác nhau tại mỗi lần mã hóa do thành phần salt thay đổi. Ngoài salt ra thì một số giải thuật key derivation function còn có thêm cả pepper nữa. :D .
 
Về mặt lý thuyết, cách mã hóa có 2 loại: mã hóa đối xứng (symmetric) và bất đối xứng (asymmetric). Dùng cách nào là tùy vào nhu cầu của bạn:

Đối xứng là chỉ có 1 khóa (secret key). Dùng cùng một khóa để mã hóa và giải mã chuỗi của bạn. Vậy nên khóa này phải luôn được giữ bí mật. Loại này bao gồm: DES, blowfish... Khóa là chuỗi bí mật bất kỳ chẳng hạn như mật khẩu nhưng phải đảm bảo đủ dài (hơn 8 ký tự) và đủ ngẫu nhiên (có chữ số, chữ hoa...)

Bất đối xứng có 2 khóa, khóa riêng (private key) và khóa công khai (public key). Khác với đối xứng, đây là một cặp khóa dùng để mã hóa và giải mã, dùng một khóa để mã hóa thì phải dùng cái còn lại để giải mã. Loại này bao gồm: RSA... Khóa là chuỗi ký tự có độ dài cố định (1024,2048 bits...) được tạo ra bởi thuật toán mã hóa.

Dùng secret key khó lưu trữ hoặc trao đổi vì tính duy nhất của nó nhưng tốc độ mã hóa và giải mã nhanh hơn nhiều khi so với bất đối xứng. Ngược lại, khóa riêng và khóa công khai có thể linh hoạt trao đổi, có khả năng định danh chống giả mạo dễ dàng hơn.

Salt là một chuỗi ký tự ngẫu nhiên. Nó được thêm vào (nối chuỗi) dữ liệu để sau khi hash không có bất kỳ bản mã hóa nào giống nhau kể cả khi hash cùng một nội dung. Việc này đảm bảo tính ngẫu nhiên của kết quả hash. Mặt khác, salt buộc phải được lưu lại để hash khi cần so sánh dữ liệu nhập vào và mã hash đã có.
 
Tuỳ thuộc vào bài toán của bạn. Nếu chỉ duy nhất 1 bên có thể mã hoá/giải mã thì symmetric encryption là đủ, việc bạn lưu encryption key ở đâu thì là câu chuyện về secure storage rồi.
Nếu trao đổi giữa 2 bên A/B, có vài cách dưới đây. Không cái gì là tuyệt đối tốt hơn cả, tuỳ thuộc vào bài toán của bạn (private/public client-server hay server-server...)
  • Asymmetric encryption để bảo vệ encryption key, và dùng encryption key để symmetric encrypt message. Tại sao? Vì asymmetric encryption không nhanh, không phù hợp mã hoá dữ lượng lớn. Ví dụ: RSAOAP cho asymmetric key encryption, AESGCM cho symmetric message encryption.
  • Key agreement. Đối với public-key cryptography như ECC không hỗ trợ asymmetric encryption thì có cách là key agreement. Hiểu nôm na là shared secret key = private key của A * public key của B = private key của B * public key của A. Sau đó dùng shared secret key để symmetric encrypt message như trên. Ví dụ: ECIES scheme với ECDH cho key agreement, sau đó tuỳ chọn symmetric encryption algorithm. Lưu ý ECDHE dùng rộng rãi hơn (vd SSL) do keypair là ephemeral, hiểu nôm na là dùng một lần vì vậy tính an toàn cao hơn (ví dụ Forward secrecy)
  • Private shared key: shared key để tránh hiểu lầm ko phải là key exchange mà đơn giản là 2 parties có 1 cái key ngầm thảo thuận từ trước và dùng nó để encrypt. Cách này "nhà quê" vì đơn giản key mà nhiều người biết thì khó bảo mật.
  • Key wrapping: giống gạch đầu dòng thứ nhất, tuy nhiên encryption key wrapped by a symmetric key. Cái symmetric key này làm thế nào để bảo mật secure giữa 2 bên thì lại là 1 vấn đề đau đầu khác :D
  • Key agreement xong dùng để wrapping encryption key: 1 biến thể nữa, kết hợp của gạch đầu dòng thứ 2 + 4.
Mã hoá gồm nhiều params nữa như salt/iv/nonce (cái bọn này dùng lộn xộn, nhưng mình nghĩ là một): giá trị ngẫu nhiên được "trộn" vào lúc mã hoá để tránh 2 messages giống nhau sẽ cùng output. 1 hệ thống thiết kế tốt sẽ có own random generator module hoạt động độc lập để tránh bị đoán giá trị tạo ra.
Authentication tag: 1 số thuật toán mã hoá hỗ trợ authentication tag để đảm bảo message
integrity: attacker tạo mã hoá giả và tự xưng là B, gửi cho A để cố đoán khoá bí mật của A. Authentication tag (AAD) giúp chống tấn công bằng cách: A check auth tag trc, nếu không khớp không thèm decrypt. Ví dụ AES GCM, hình như CBC không có
tag: 1 số giải thuật ouput có sinh tag append với ciphertext. Chẳng rõ làm gì :D
KDF: tạo nhiều phiên bản từ 1 master key, mục đích tránh bị lộ master key nếu 1 trong những derived key bị lộ. KDF gần như bắt buộc trong mã hoá hiện đại, hiếm thấy protocol nào không có một bước KDF trước khi encrypt.
Hash: băm. HMAC: băm với thêm đầu vào là private key (mình hiểu nôm na vậy)
Gì nữa ta, dạo này mần mần toàn dùng ECC, không nhớ quên bài gì của RSA không :D
Quantum computing đúng là 1 cái gì đó rất hoành tráng, mà vẫn đang nghiên cứu thôi. Dự đoán nếu quantum computin mature thì RSA, ECC, internet bây giờ là lủng hết, bao giờ nó ra ae dev lại zác zú update code.

Nói tóm lại: cái khoá nó quan trọng lắm trong software. Nhớ cất kỹ.
 
giải ntn vậy bạn

@Sixxx1235
Em sử dụng thuật toán DNA - XOR để mã hóa và giải mã ảnh thôi ạ; thuật toán này gần như thuật toán thế LSB trong ảnh. Tuy nhiên, thuật toán này sử dụng thêm một toán tử nữa để lựa chọn giá trị nhúng tối ưu để không làm thay đổi quá nhiều chất lượng ảnh gốc.. Bác tìm trên youtube cũng có ấy ạ
 
Em sử dụng thuật toán DNA - XOR để mã hóa và giải mã ảnh thôi ạ; thuật toán này gần như thuật toán thế LSB trong ảnh. Tuy nhiên, thuật toán này sử dụng thêm một toán tử nữa để lựa chọn giá trị nhúng tối ưu để không làm thay đổi quá nhiều chất lượng ảnh gốc.. Bác tìm trên youtube cũng có ấy ạ
ý hỏi là tìm tin nhắn ntn?
 
Tuỳ thuộc vào bài toán của bạn. Nếu chỉ duy nhất 1 bên có thể mã hoá/giải mã thì symmetric encryption là đủ, việc bạn lưu encryption key ở đâu thì là câu chuyện về secure storage rồi.
Nếu trao đổi giữa 2 bên A/B, có vài cách dưới đây. Không cái gì là tuyệt đối tốt hơn cả, tuỳ thuộc vào bài toán của bạn (private/public client-server hay server-server...)
  • Asymmetric encryption để bảo vệ encryption key, và dùng encryption key để symmetric encrypt message. Tại sao? Vì asymmetric encryption không nhanh, không phù hợp mã hoá dữ lượng lớn. Ví dụ: RSAOAP cho asymmetric key encryption, AESGCM cho symmetric message encryption.
  • Key agreement. Đối với public-key cryptography như ECC không hỗ trợ asymmetric encryption thì có cách là key agreement. Hiểu nôm na là shared secret key = private key của A * public key của B = private key của B * public key của A. Sau đó dùng shared secret key để symmetric encrypt message như trên. Ví dụ: ECIES scheme với ECDH cho key agreement, sau đó tuỳ chọn symmetric encryption algorithm. Lưu ý ECDHE dùng rộng rãi hơn (vd SSL) do keypair là ephemeral, hiểu nôm na là dùng một lần vì vậy tính an toàn cao hơn (ví dụ Forward secrecy)
  • Private shared key: shared key để tránh hiểu lầm ko phải là key exchange mà đơn giản là 2 parties có 1 cái key ngầm thảo thuận từ trước và dùng nó để encrypt. Cách này "nhà quê" vì đơn giản key mà nhiều người biết thì khó bảo mật.
  • Key wrapping: giống gạch đầu dòng thứ nhất, tuy nhiên encryption key wrapped by a symmetric key. Cái symmetric key này làm thế nào để bảo mật secure giữa 2 bên thì lại là 1 vấn đề đau đầu khác :D
  • Key agreement xong dùng để wrapping encryption key: 1 biến thể nữa, kết hợp của gạch đầu dòng thứ 2 + 4.
Mã hoá gồm nhiều params nữa như salt/iv/nonce (cái bọn này dùng lộn xộn, nhưng mình nghĩ là một): giá trị ngẫu nhiên được "trộn" vào lúc mã hoá để tránh 2 messages giống nhau sẽ cùng output. 1 hệ thống thiết kế tốt sẽ có own random generator module hoạt động độc lập để tránh bị đoán giá trị tạo ra.
Authentication tag: 1 số thuật toán mã hoá hỗ trợ authentication tag để đảm bảo message
integrity: attacker tạo mã hoá giả và tự xưng là B, gửi cho A để cố đoán khoá bí mật của A. Authentication tag (AAD) giúp chống tấn công bằng cách: A check auth tag trc, nếu không khớp không thèm decrypt. Ví dụ AES GCM, hình như CBC không có
tag: 1 số giải thuật ouput có sinh tag append với ciphertext. Chẳng rõ làm gì :D
KDF: tạo nhiều phiên bản từ 1 master key, mục đích tránh bị lộ master key nếu 1 trong những derived key bị lộ. KDF gần như bắt buộc trong mã hoá hiện đại, hiếm thấy protocol nào không có một bước KDF trước khi encrypt.
Hash: băm. HMAC: băm với thêm đầu vào là private key (mình hiểu nôm na vậy)
Gì nữa ta, dạo này mần mần toàn dùng ECC, không nhớ quên bài gì của RSA không :D
Quantum computing đúng là 1 cái gì đó rất hoành tráng, mà vẫn đang nghiên cứu thôi. Dự đoán nếu quantum computin mature thì RSA, ECC, internet bây giờ là lủng hết, bao giờ nó ra ae dev lại zác zú update code.

Nói tóm lại: cái khoá nó quan trọng lắm trong software. Nhớ cất kỹ.
cho mình hỏi chút, ví dụ như thuật mã hoá cổ điển ko public thuật toán ra so với public thuật toán theo kiểu mã hoá đối xứng và sử dụng key thì cái nào bảo mật tốt hơn và tại sao vậy?
 
cho mình hỏi chút, ví dụ như thuật mã hoá cổ điển ko public thuật toán ra so với public thuật toán theo kiểu mã hoá đối xứng và sử dụng key thì cái nào bảo mật tốt hơn và tại sao vậy?
Mình nghĩ là các khái niệm đang bị trộn lẫn với nhau nên chưa hiểu rõ câu hỏi lắm. Việc public thuật toán mã hoá đều được các chuẩn hiện đại đang dùng (TLS protocol, bật network debug session lên sẽ thấy hiện rõ chữ ký dùng thuật toán gì, mã hoá dùng gì...) và đều đang chứng tỏ bảo mật tốt. Ăn nhau là ở độ 'mạnh' và 'chuẩn' của thuật toán, ví dụ như dù ngta biết bạn dùng AESGCM-SHA256 thì cũng khó lòng mà tấn công đc vì nó được thiết kế rất tốt, mà thay vào đó họ sẽ cố gắng tấn công encryption key.
Mã hoá đối xứng/ bất đối xứng là chỉ cách bạn mã hoá, giải mã. Với RSA bạn dùng khoá công khai (pubkey) để mã hoá, và chỉ có người duy nhất có khoá bí mật tương ứng (privatekey) có thể giải mã. Tuy nhiên cách này chỉ cho dữ liệu bé, cho thời gian thực hiện rất lâu.
Có rất nhiều cách tấn công, và các thuật toán cũng được thiết kế rất tỉ mỉ để chống. Thực ra nếu ko phải người nghiên cứu mật mã học (mình ko phải nha :) ) thì cách được khuyên dùng nhất là theo industry standard, ngta dùng cách gì thì mình dùng theo.
Một cách khá 'không theo chuẩn' là A<->B tự quy ước 1 luật ngầm (ê tao bảo chữ A mày phải hiểu là chữ E). Vấn đề là nếu Eve đoán luật đấy, thì A và B tiêu đời :)
 
Mật khẩu họ dùng băm làm sao decode dc
Về lý thuyết thì được nhé, nhưng mà chưa có máy tính nào đủ mạnh để decode ngược lại được thôi. :LOL: .
Nguyên tắc mã hóa từ xưa đến giờ vẫn chưa hề thay đổi.
Thông tin gốc => Key => Thông tin đc mã hóa
Thông tin đc mã hõa => Key => Thông tin gốc
Mấy cái mã hóa dạng băm chẳng qua việc tìm key của nó quá lâu nên mới không khả thi, chứ thử có con siêu máy tính tốc độ gấp 1 tỷ lần cái siêu máy tính mạnh nhất hiện nay là mấy cái hash 256 này là đbrr hết.

Chẳng vậy mà bọn cường quốc nó đầu tư vào máy tính lượng tử vcl. Nó biết là nếu làm đc cái máy tính như vậy thì bọn còn lại coi như bị bắt thóp chết hết. :rolleyes:
 
Về lý thuyết thì được nhé, nhưng mà chưa có máy tính nào đủ mạnh để decode ngược lại được thôi. :LOL: .
Nguyên tắc mã hóa từ xưa đến giờ vẫn chưa hề thay đổi.
Thông tin gốc => Key => Thông tin đc mã hóa
Thông tin đc mã hõa => Key => Thông tin gốc
Mấy cái mã hóa dạng băm chẳng qua việc tìm key của nó quá lâu nên mới không khả thi, chứ thử có con siêu máy tính tốc độ gấp 1 tỷ lần cái siêu máy tính mạnh nhất hiện nay là mấy cái hash 256 này là đbrr hết.

Chẳng vậy mà bọn cường quốc nó đầu tư vào máy tính lượng tử vcl. Nó biết là nếu làm đc cái máy tính như vậy thì bọn còn lại coi như bị bắt thóp chết hết. :rolleyes:
thým không hiểu là băm không thể decode dc à?

bản thân khi băm thì output nó chỉ là 1 chuỗi dữ liệu không còn toàn vẹn thì làm sao có cái gọi là decode?

cái mà bạn tưởng rằng giải mã nó là rainbow table attack thôi, bạn nên xem lại lý thuyết mã hóa và hàm băm trước khi phát biểu
 
Thực ra với hàm băm thì không cần phải decode. Chỉ cần tìm một chuỗi bất kỳ có băm trùng là coi như kẻ tấn công thắng lớn rồi.

Ví dụ như password. Nếu biết băm của password và tìm ra được môi chuỗi có băm giống vậy thì có thể dùng nó để đăng nhập rồi, cần gì phải quan tâm pass thật là gì.
Còn vụ xác thực toàn vẹn dữ liệu, nếu biết cách chỉnh tài liệu để sử thông tin theo ý muốn mà vẫn không thay đổi băm thì cũng dùng để giả mạo được rồi.
không thể chứ không phải là không cần
 
mã hóa 1 chiều mà sao decode đc nhỉ :D
Sao lại không đươck thím ? Mật mã học lý thuyết cơ bản đã nói là không có một loại mã hoá nào không thể dịch ngược được. Vì nếu không dịch ngược được thì không thể kiểm tra phuông pháp mã hoá đó đúng hay sai.

Ví dụ A mã hoá ra a, B mã hoá ra b. Nếu như không thể dịch ngược lại thì làm sao kiểm chứng được phương pháp mã hoá đó là đúng ? Lỡ như A mã hoá ra a rồi B mã hoá cũng ra a thì sao ?

Vụ tính chất một chiều của hàm băm bạn có vẻ đã nhầm.
Tính chất không thể đảo ngược đó thực ra có nghĩa rằng: không thể tìm khóa dùng cho việc mã hóa một khối A thành một khối B bằng một phương pháp nào nhanh hơn là vét cạn.
Trích từ wiki https://vi.m.wikipedia.org/wiki/Hàm_băm_mật_mã_học
 
Sao lại không đươck thím ? Mật mã học lý thuyết cơ bản đã nói là không có một loại mã hoá nào không thể dịch ngược được. Vì nếu không dịch ngược được thì không thể kiểm tra phuông pháp mã hoá đó đúng hay sai.

Ví dụ A mã hoá ra a, B mã hoá ra b. Nếu như không thể dịch ngược lại thì làm sao kiểm chứng được phương pháp mã hoá đó là đúng ? Lỡ như A mã hoá ra a rồi B mã hoá cũng ra a thì sao ?

Vụ tính chất một chiều của hàm băm bạn có vẻ đã nhầm.

Trích từ wiki https://vi.m.wikipedia.org/wiki/Hàm_băm_mật_mã_học

K thể dịch ngược lại là đúng rồi chứ.
Cái mà anh nói: A mã hóa ra a và B cũng mã hóa ra a thì gọi là Hash collision, không một thuật toán hash nào tránh được vì tính chất của hàm hash đại loại là "với mọi input đều cho ra output với cùng length". Suy ra là chỉ có một số lượng output giới hạn xác định trong khi số lượng input là vô hạn. Trên thực tế, nếu 2 string mà ra cùng một giá trị hash cũng không phải vấn đề quá lớn đối với ứng dụng là hash mật khẩu.
Dịch ngược lại thế nào được. Ví dụ tôi hash đoạn text trả lời của anh bằng MD5, nó ra một mớ như thế này: "938be9704499c293015581840519b28b". Vậy thì từ bằng đây bytes anh nghĩ làm thế nào lấy lại bài viết dài hàng trăm byte của anh được?
 
thực tế tý đi fen, máy tính lượng tử đâu ra, phổ cập đâu fen

Mã hoá nào cũng mở đc cả, vấn đề thời gian giải mã. RSA đưa vô máy tính lượng tử là banh

Éo cần lượng tử cũng dò ra đc nhá.

lượng tử chỉ bẻ đc RSA vì bài toán phân tích số nguyên tố. RSA bị bẻ thì lộ Private key. còn AES-xxx thì hiện tại mới chỉ có brute force đc thôi, mà brute force thì...còn lâu.

Sent from Xiaomi M2101K7AG using vozFApp
 
Sao lại không đươck thím ? Mật mã học lý thuyết cơ bản đã nói là không có một loại mã hoá nào không thể dịch ngược được. Vì nếu không dịch ngược được thì không thể kiểm tra phuông pháp mã hoá đó đúng hay sai.

Ví dụ A mã hoá ra a, B mã hoá ra b. Nếu như không thể dịch ngược lại thì làm sao kiểm chứng được phương pháp mã hoá đó là đúng ? Lỡ như A mã hoá ra a rồi B mã hoá cũng ra a thì sao ?

Vụ tính chất một chiều của hàm băm bạn có vẻ đã nhầm.

Trích từ wiki https://vi.m.wikipedia.org/wiki/Hàm_băm_mật_mã_học
Hash nó chỉ là 1 hàm mapping từ input ra output. Và hàm hash kiểu MD5 thì không phải là 1-1 mapping nên có thể 2 input ra cùng 1 output. Vậy nên từ 1 output không thể tìm trả ngược lại input được. Còn để tìm 1 hàm hash thỏa mãn khả năng hash collision thấp thì có toán chứng minh rồi.

Còn một số mã hóa encoding kiểu Base64 hay cypher thì hoàn toàn có thể làm ngược lại được. Cũng có 1 số hàm mã hóa có thể đảo ngược được nhưng chỉ trên lý thuyết, máy tính turing hiện tại không làm được trong thời gian cho phép (chờ máy tính lượng tử)
 
Ví dụ một người có thông tin là tên, tuổi, quê là: Nam, 31, Vĩnh Phúc. Thì mình muốn mã hoá cái chuỗi kiểu như Nam31VinhPhuc thành một mã ký tự bí mật và gần như là duy nhất. Về sau có thể decode cái ký tự bí mật đó ra thành Nam, 31, Vĩnh Phúc thì làm cách nào để tránh bị lộ dữ liệu hay làm giả vậy?


ps: à quên, đăng xong lại nhớ ra là có cái bcrypt hay dùng cho password, chắc dùng cái ý cũng được nhỉ mn
Chủ thớt cần phân biệt được Encoding , Encryption và Hashing
https://www.nextsec.vn/2021/01/encoding-encryption-va-hashing.html
 
K thể dịch ngược lại là đúng rồi chứ.
Cái mà anh nói: A mã hóa ra a và B cũng mã hóa ra a thì gọi là Hash collision, không một thuật toán hash nào tránh được vì tính chất của hàm hash đại loại là "với mọi input đều cho ra output với cùng length". Suy ra là chỉ có một số lượng output giới hạn xác định trong khi số lượng input là vô hạn. Trên thực tế, nếu 2 string mà ra cùng một giá trị hash cũng không phải vấn đề quá lớn đối với ứng dụng là hash mật khẩu.
Dịch ngược lại thế nào được. Ví dụ tôi hash đoạn text trả lời của anh bằng MD5, nó ra một mớ như thế này: "938be9704499c293015581840519b28b". Vậy thì từ bằng đây bytes anh nghĩ làm thế nào lấy lại bài viết dài hàng trăm byte của anh được?
Đúng rồi. Hash 2 input vẫn có xác suất ra cùng 1 output.
Trong java cũng vậy, khi implement 1 class hỗ trợ hash base, ngoài override hàm hashCode, luôn yêu cầu override hàm equals


via theNEXTvoz for iPhone
 
Back
Top