2010-10-05 77 views
6

Tôi đang làm việc trên trang web mua sắm an toàn đầu tiên của mình. Chúng tôi không lưu trữ dữ liệu thẻ tín dụng, vì vậy đó không phải là vấn đề. Tuy nhiên, chúng tôi có khóa giao dịch và khóa đăng nhập API cho cổng thanh toán của chúng tôi (authorize.net) mà tôi muốn giữ cơ sở dữ liệu hơn là mã hóa cứng vào php của mình. Tôi không biết rằng chúng tôi cần bảo mật to lớn, nhưng tôi không muốn lưu trữ nó bằng văn bản thuần túy. Tôi biết về sha, nhưng đó là một chiều. Tôi cần một cách để lưu trữ các giá trị trong cơ sở dữ liệu trong một định dạng bán an toàn, nhưng sau đó có thể "giải mã" nó lập trình để sử dụng trong chức năng của tôi.Mã hóa 2 chiều bằng PHP - cần một số hướng dẫn

Một lưu ý nữa là trang web của tôi được lưu trữ, có nghĩa là có giới hạn rất hạn chế đối với loại nội dung tôi có thể cài đặt, vì vậy, lý tưởng là mọi giải pháp đều dựa trên cài đặt php chuẩn.

Có ai có thể chỉ cho tôi đúng hướng không? Tôi rất mới để bảo vệ dữ liệu.

CHỈNH SỬA ĐỂ THÊM: Tôi đã kiểm tra với máy chủ lưu trữ và mật khẩu của mình đã được cài đặt. Đây có phải là hướng đi đúng đắn không?

+0

Bạn không thể bảo vệ dữ liệu của mình từ quản trị viên của công ty lưu trữ. Chỉ là không thể trong lý thuyết. –

+0

Chúng tôi không cố gắng bảo vệ dữ liệu từ quản trị viên lưu trữ; chúng tôi chỉ muốn chắc chắn rằng nếu họ bị tấn công và cơ sở dữ liệu của chúng tôi bị xâm phạm, các khóa vào cổng thanh toán của chúng tôi không phải là văn bản thuần túy. – EmmyS

Trả lời

2

Mcrypt có thể là bạn của bạn ở đây. Tuy nhiên, những gì bạn cần phải tính đến là mọi phương thức mã hóa có sẵn công khai (và hữu ích) đều yêu cầu một khóa. Nếu mã hóa AES hoặc mã hóa 3DES không yêu cầu khóa trong quá trình mã hóa thì việc phá vỡ mã hóa sẽ chỉ là vấn đề thử mọi phương thức giải mã chuẩn cho đến khi bạn nhận được kết quả có ý nghĩa. Vì vậy, việc lưu trữ khóa cho cổng thanh toán của bạn phát sinh các rủi ro chính xác giống như lưu trữ khóa cho mã hóa của bạn. Bất kể có bao nhiêu lớp mã hóa bạn muốn thêm vào, ở một mức độ nào đó sẽ phải có khóa được lưu trữ trong văn bản thuần túy, thường được mã hóa cứng vào PHP và thường trong tệp config.php được bao gồm để dễ dàng thay đổi trong tương lai .

Tùy chọn duy nhất để lưu trữ an toàn thông tin mà không cần chìa khóa sẽ là phát minh ra phương pháp mã hóa của riêng bạn. Tính bảo mật của phương pháp này chỉ nằm trong thực tế là không ai biết phương tiện mà bạn đang mã hóa chuỗi, do đó, họ không có một mô hình từng bước để chỉ đi ngược lại. Nếu bạn đã từng nói với ai đó cách mã hóa của bạn hoạt động, thì bảo mật sẽ bị mất. Ngoài ra, có rất nhiều cách để giải mã các mã hóa đơn giản (ví dụ như thay thế thư). Đây là lý do tại sao các nhà toán học nhận được rất nhiều tiền để phát triển những thứ như AES.

Tốt nhất của bạn là xem xét MCrypt EncryptMCrypt Decrypt. Bằng cách này, nếu chỉ PHP của bạn bị xâm phạm thì họ biết khóa bạn đã sử dụng để mã hóa, nhưng chúng không có dữ liệu.Nếu chỉ có cơ sở dữ liệu bị xâm phạm thì chúng có dữ liệu chứ không phải khóa mà bạn sử dụng để mã hóa nó. Nếu cả hai bị tổn hại, bạn sẽ bị say. Nhưng nếu cả hai bị tổn hại, bạn sẽ bị vặn vẹo bất kể bạn làm gì, vì vậy đó là một tuyến đường khá an toàn.

+0

Cảm ơn, Steven. Tôi biết rằng nếu cả hai mã và cơ sở dữ liệu bị tấn công, chúng tôi đang lên một con lạch. Nhưng đó là khá nhiều trường hợp ở khắp mọi nơi, phải không? Chỉ có rất nhiều bạn có thể làm. – EmmyS

+0

Có một cách tôi biết xung quanh vấn đề đó, trên thực tế, nhưng nó liên quan đến rất nhiều mã và rất nhiều chi phí. Tôi đã thực hiện một hệ thống một lần sử dụng ba máy tính. Một là "chủ nhân PHP", một là "chủ cơ sở dữ liệu", và một là "chủ nhân chính". Thạc sĩ PHP có chìa khóa để làm chủ cơ sở dữ liệu, chủ cơ sở dữ liệu có khóa cho master chủ chốt, và master chủ chốt có một cơ sở dữ liệu các khóa (một cho mỗi hàng dữ liệu) cho dữ liệu trong master database. Tôi cũng đã có tất cả PHP trên ổ đĩa cứng được mã hóa và nó đã được giải mã vào một ổ đĩa RAM khi máy tính khởi động. – stevendesu

+0

Vâng, tôi không chắc chắn rằng khách hàng của chúng tôi sẽ sẵn sàng trả tiền cho số lượng công việc cần thực hiện. Ngoài ra, một lần nữa - trang web được lưu trữ trên đám mây, vì vậy chúng tôi cần giữ mọi thứ ở một vị trí đơn lẻ. (Và tôi không thể không cười khúc khích và suy nghĩ, "chỉ có zul" mỗi khi bạn đề cập đến chủ chốt ...) – EmmyS

-2

Từ quan điểm bảo mật, không có sự khác biệt bằng cách lưu trữ nó trong tệp php hoặc trong cơ sở dữ liệu, nếu ai đó có quyền truy cập vào tệp php của bạn, người đó cũng có quyền truy cập vào cơ sở dữ liệu.

làm việc với Mcrypt không có nghĩa là bạn sẽ có an ninh THÊM, (nếu họ có thể đọc các file php của bạn họ có thể đọc phím cũng) như vậy ...

Nếu tôi là bạn tôi muốn lưu trữ Khóa API ở dạng văn bản thuần túy trên một tệp bên ngoài thư mục máy chủ web.

chỉ cần viết mã tốt bạn nên ổn.

+0

Chúng tôi không lưu trữ nó trong cơ sở dữ liệu để đảm bảo an toàn; chúng tôi đang làm điều đó để chúng tôi có thể viết giao diện người dùng để cho phép người không phải lập trình thay đổi giá trị nếu cần. Điều đó nói rằng, chúng tôi muốn nó không được lưu trữ trong văn bản thuần. Và một lần nữa - trang web này được lưu trữ trên đám mây; chúng tôi không có quyền truy cập vào các thư mục bên ngoài không gian máy chủ web mà chúng tôi đang cung cấp. – EmmyS

+0

Trên thực tế, bạn nên LUÔN LUÔN giả định rằng các thành phần khác nhau của máy chủ từ xa là những rủi ro bảo mật cá nhân. Có thể thông qua việc tiêm SQL hoặc truy vấn không đúng định dạng đơn giản để trả về các hàng của một cơ sở dữ liệu mà không ảnh hưởng đến mã PHP. Đây là lý do tại sao bạn luôn băm mật khẩu - chỉ trong trường hợp ai đó có cơ sở dữ liệu của bạn. Các muối được phát minh để ngăn chặn các cuộc tấn công của bảng cầu vồng, và giống như một khóa mcrypt - nếu ai đó có muối, họ có thể phá vỡ nó và vẫn sử dụng một chiếc bàn cầu vồng. – stevendesu

+0

Tôi không hiểu tại sao mọi người lại downvoting những gì tôi đã nói, nếu bạn tin rằng bạn sẽ được an toàn hơn bởi băm nó làm điều đó, nó sẽ không thay đổi một điều gì. Để đối phó với loại bảo mật này, bạn nên có một cơ sở hạ tầng rất khác, bạn đang lưu trữ một API KEY, bạn sẽ có cùng một "bảo mật" với một băm như với một mã txt đơn giản. bạn đang lưu trữ các tệp kết nối db của mình ở đâu: p? Bạn nên kiểm tra rất tốt những gì mà API KEY được phép làm thay vào đó. Ý tôi là, API KEY đó chỉ có thể thực hiện một số thứ nhất định từ một IP được xác định ... – sathia

0

Hmm, bạn có thể thử mã hóa AES. Vấn đề là bạn phải lưu hàm băm muối (98sdfx9c6v5c) ở đâu đó trong PHP của bạn.

Chèn config:

INSERT INTO config (secret_key) VALUES (AES_ENCRYPT('secret api key','98sdfx9c6v5c')); 

chọn cấu hình:

SELECT AES_DECRYPT(secret_key,'98sdfx9c6v5c') AS secret_url FROM config 
Các vấn đề liên quan