2011-08-31 38 views
12

Tôi đang viết một ứng dụng C# sẽ là nguồn mở và tôi cần có khả năng lưu trữ thông tin đăng nhập đã lưu cho từng người dùng. Thông thường tôi sẽ chỉ mã hóa mật khẩu và sau đó lưu trữ nó trong một tập tin cài đặt người dùng, nhưng tôi lo lắng vì mã nguồn là mã nguồn mở, nó đánh bại điểm mã hóa nó. Vì tất cả mọi người sẽ phải làm là nhìn vào mã và lấy khóa mã hóa.Lưu trữ mật khẩu đã lưu trong ứng dụng Mã nguồn mở

Được cấp, ít nhất sẽ làm cho nó khó hơn rất nhiều so với mật khẩu được lưu trữ ở dạng văn bản thuần túy. Nhưng có cách nào để mã hóa mật khẩu, nhưng làm cho nó vẫn còn ít nhất là rất khó để giải mã nó ngay cả khi bạn có nguồn? Có lẽ làm cho nó như vậy nó sẽ ít nhất là gần như không thể giải mã trên bất kỳ máy tính khác hơn là một trong nó đã được mã hóa trên?

EDIT: Làm rõ ... Tôi đang lưu trữ mật khẩu bên CLIENT, KHÔNG mật khẩu để xác thực đăng nhập của họ cho dịch vụ. Đó là một khách hàng với một dịch vụ web đã tồn tại từ trước mà tôi không có quyền kiểm soát. Tôi chỉ muốn lưu trữ mật khẩu cục bộ để đăng nhập tự động ... giống như bất kỳ ứng dụng trò chuyện nào.

CHỈNH SỬA 2: Hoàn toàn xin lỗi vì không rõ ràng trước đây. Nhưng mật khẩu phải được lấy ra trong văn bản rõ ràng tại một số điểm và băm không phải là một lựa chọn: (Ngay cả khi dịch vụ sẽ cho phép tôi vượt qua băm mật khẩu sẽ đánh bại mục đích vì băm sẽ tốt như mật khẩu: P

Trả lời

1

Tôi nghĩ rằng nếu bạn sử dụng Rijndal chẳng hạn và tạo các giá trị muối ngẫu nhiên và lấy chìa khóa từ những thứ cụ thể của máy móc (như một số ID phần cứng) thì sẽ rất khó giải mã, ngay cả khi bạn biết nó hoạt động như thế nào. của phần cứng.

Nhưng bạn có thể cân nhắc việc lưu trữ băm chỉ các mật khẩu và lặp ít nhất 1000 lần. hashes không thể covnerted lại mật khẩu ban đầu.

Tuy nhiên, một ý tưởng khác: nó có thể là một lựa chọn để chỉ để thực hiện lên đến những người sẽ sử dụng nguồn của bạn và làm cho trừu tượng mã hóa? Không hoạt động tất nhiên nếu bạn cung cấp một gói được xây dựng để tải xuống. Nhưng sau đó một lần nữa: trong xây dựng, bạn có thể sử dụng mã hóa "bí mật" và thân của bạn có nó trừu tượng trong nguồn.

+0

Không hiểu ý bạn về băm ... Tôi cần văn bản rõ ràng thực tế của mật khẩu tại một số điểm vì nó phải được chuyển từ khách hàng của tôi sang dịch vụ (kết nối được mã hóa) và không thể một băm. –

+0

Từ mật khẩu bạn nhận được, chỉ cần tính toán băm một lần nữa và so sánh với băm bạn lưu trữ trong DB. Nếu chúng khớp, mật khẩu sẽ khớp nhau. Tất nhiên nếu bạn cần mật khẩu để đăng nhập ở một nơi khác từ máy chủ của bạn, điều này sẽ không giúp bạn. – Krumelur

+3

Ông CHANGED câu hỏi một phần, làm rõ thực sự, bỏ phiếu xuống là một ltitle không công bằng. – Lloyd

0

Có thể bạn có thể mã hóa mật khẩu bằng cách sử dụng một số giá trị cụ thể của máy, như mac hoặc sth .. Nếu ai đó lấy nguồn và mật khẩu được mã hóa nhưng không có quyền truy cập đầy đủ vào mật khẩu máy sẽ an toàn.

+0

giá trị mac không an toàn. Hãy xem xét cách dễ dàng để có được giá trị mac của máy tính –

+0

Bạn nói đúng, tôi vẫn còn trong tư duy không nguồn mở. Dù sao vẫn còn ý tưởng là để có được giá trị máy cụ thể. – szamil

4

Nếu bạn đang sử dụng ứng dụng này trong Windows, bạn có thể sử dụng DPAPI để lưu trữ dữ liệu nhạy cảm trên danh nghĩa của người dùng:

How To: Use DPAPI to Encrypt and Decrypt Data (C#/VB.NET)

Cũng lưu trữ các hash chỉ thay vì toàn bộ mật khẩu là một ý tưởng tốt!

7

Điều bạn đang hỏi về cơ bản là không thể.

không cách lưu trữ mật khẩu an toàn trên máy khách nếu nó cần được giải mã. Điều này càng trầm trọng hơn bởi thực tế là bạn cần nó để kết nối với một dịch vụ mà tôi cho là không hỗ trợ SSL. Trong trường hợp này, người ta có thể tìm thấy mật khẩu bằng cách sử dụng một bộ phân tích mạng.

Có một trò chơi (nguồn đóng, tất nhiên) Tôi chơi yêu cầu đăng nhập, mật khẩu được lưu ở đâu đó nhưng được mã hóa bằng khóa duy nhất cho mỗi lần cài đặt.Tôi quên mật khẩu một lần, vì vậy tôi chỉ sử dụng Wireshark, và thì đấy - tôi có thể thấy mật khẩu đơn giản.

Điều này cũng nhắc tôi về những người phàn nàn về việc dễ dàng tiết lộ mật khẩu trong Google Chrome ... Họ rõ ràng là không biết rõ hơn. Bạn có thể thử tất cả các thủ thuật thông minh mà bạn muốn, nhưng mọi bảo mật ứng dụng đều được ném ra ngoài cửa sổ khi ai đó có quyền truy cập vào máy.

Vì vậy, với điều này trong tâm trí, tôi sẽ giữ cho việc mã hóa và giải mã thực sự đơn giản. Tốt nhất, bạn có thể tạo khóa có nguồn gốc từ một cái gì đó unique to the machine, vì vậy ai đó đánh cắp mật khẩu được mã hóa sẽ không thể giải mã nó mà không truy cập vào khóa duy nhất đã nói.

+0

May mắn thay, dịch vụ cung cấp SSL. Và vâng, tôi biết cách duy nhất hoàn toàn an toàn là làm cho người dùng nhập mật khẩu MACHI thời gian, nhưng tôi nghĩ hầu hết là sẵn sàng từ bỏ một chút bảo mật cho điều đó. –

+0

để cung cấp một số loại mã thông báo từ máy chủ với một số loại hiệu lực ... nó không chống cháy nhưng nó là tốt như nó có thể nhận được –

+0

Xin vui lòng bạn cũng có thể đề cập đến một số thuật toán tôi có thể sử dụng để mã hóa mật khẩu? –

0

Yuo có thể sử dụng mã hóa búp bê babushka. Bạn mã hóa mật khẩu bằng một mật khẩu khác, sau đó mã hóa mật khẩu đó bằng một mật khẩu khác và thực hiện rất nhiều lần để viết mật khẩu cuối cùng trong văn bản rõ ràng. Bất cứ ai muốn truy cập vào mật khẩu orignal sẽ bị bệnh của tất cả các unencrypting và bỏ trước khi họ nhận được mật khẩu ban đầu.

+0

Không chắc tôi nên mất điểm vì bạn không có cảm giác hài hước. – oenpelli

Các vấn đề liên quan