2009-09-27 45 views
5

Tôi đang viết một ứng dụng cần đọc tên người dùng và mật khẩu và lưu trữ chúng để chương trình có thể đọc lại sau. Lưu trữ nó trong một số biến âm thanh như một ý tưởng ngu ngốc.Lưu mật khẩu trong một ứng dụng

Tìm thấy rằng KDE library, nhưng nó có sự phụ thuộc quá lớn, và tôi là lập trình viên quá mới để hiểu cách sử dụng nó.

Phương pháp phổ biến để lưu trữ mật khẩu là gì và cách tôi có thể giải quyết vấn đề của mình?

Trả lời

7

Tùy thuộc vào việc bạn sẽ làm gì với thông tin.

Nếu bạn định sử dụng tên và mật khẩu để truy cập một số dịch vụ bên ngoài (nhưng người dùng sẽ phải nhập lại thông tin vào lần chạy chương trình tiếp theo), thì lưu trữ chúng trong một số biến là OK. Nó có thể là khôn ngoan để lưu trữ chúng được mã hóa (ít nhất, lưu trữ mật khẩu được mã hóa) để nó không được nhìn thấy trong các bãi lõi hoặc tương đương. Khi mật khẩu là cần thiết, bạn giải mã nó, sử dụng nó, và sau đó viết trên nơi mà các phiên bản giải mã được lưu trữ (zapping nó). (Lưu ý: băm không phù hợp trong ngữ cảnh này, bạn cần có thể xem mật khẩu và bạn không thể hoàn tác một băm.) Bạn có thể quyết định lưu trữ thông tin bên ngoài chương trình (trong một tệp đĩa), nhưng nó dường như không cần thiết. Lưu ý rằng mã nhị phân vẫn sẽ chứa khóa mã hóa (và thuật toán mã hóa), và dữ liệu được mã hóa ngẫu nhiên hơn so với nội dung trung bình của chương trình của bạn, vì vậy để che giấu mật khẩu được mã hóa thực sự rất khó (verging on impossible). Tuy nhiên, bạn có thể làm cho nó đủ cứng để nó sẽ ngăn chặn tất cả trừ những kẻ tấn công được xác định nhất.

Nếu bạn định lưu trữ tên người dùng và mật khẩu làm hồ sơ vĩnh viễn để bạn có thể xác thực rằng cùng một người dùng đang truy cập thông tin trong tương lai, thì bạn phải sử dụng bộ nhớ bên ngoài chương trình; bạn sẽ sử dụng một cơ sở dữ liệu đơn giản, có thể đơn giản như một tệp văn bản thuần túy nếu bạn đảm bảo bạn giải quyết bất kỳ vấn đề đồng thời nào. Trong trường hợp này, bạn sẽ băm mật khẩu với một số muối, và bạn sẽ lưu trữ tên người dùng, muối và mật khẩu băm theo cách mà cho tên người dùng, bạn có thể dễ dàng tìm thấy hai giá trị kia.


Đêm Walker nhận xét:

tôi sử dụng mật khẩu để truy cập vào một số cơ sở dữ liệu web, vì vậy tôi cần nó được lưu trữ trong ứng dụng của tôi sau khi nó được nhập cho lần đầu tiên. Bạn có chắc rằng một tệp văn bản thuần túy là một ý tưởng thông minh?

Nó phụ thuộc vào cách bạn hình thành 'được lưu trữ trong ứng dụng của tôi'. Bạn không thể sửa đổi tệp thực thi, hoặc ít nhất không nên cố gắng làm như vậy. Vì vậy, bạn cần phải nhìn vào nó như một hồ sơ vĩnh viễn được lưu trữ trong một số loại tập tin riêng biệt từ các ứng dụng thực thi. Mặt khác, bạn phải đối mặt với một vấn đề khác với những gì tôi vạch ra - bạn không xác thực người dùng bằng thông tin; bạn cần giải mã thông tin theo yêu cầu để gửi cho các ứng dụng khác.

Trước hết, điều đó có nghĩa là muối và băm không có liên quan; bạn cần đảo ngược hoạt động che mặt nạ và bạn không thể đảo ngược mã băm.

Tiếp theo, bạn cần quyết định cách bạn sẽ xác định người dùng của ứng dụng khi xuất hiện lại. Người dùng có bắt buộc phải nhập một số mật khẩu để lấy dữ liệu của riêng họ hay không, hoặc bạn sẽ chỉ dựa vào các đặc quyền của hệ điều hành hoặc một số chương trình khác.

Nếu người dùng phải nhập một số mật khẩu vào ứng dụng của bạn để bắt đầu, bạn có thể xem xét sử dụng mật khẩu đó (hoặc mã băm của nó, khác với mật khẩu băm được sử dụng để nhận dạng mật khẩu cho ứng dụng) để mã hóa tên người dùng/kết hợp mật khẩu cho ứng dụng bên ngoài. Sau đó bạn có thể lưu trữ tên người dùng và, vì lợi ích của đối số, một phiên bản mã hóa Base-64 của mật khẩu được mã hóa thành một tệp văn bản; đây là an toàn như mật khẩu ứng dụng, được lưu trữ ở định dạng băm muối gốc. Khi người dùng trả về, họ phải cung cấp tên người dùng và mật khẩu ứng dụng của họ và bạn có thể xác thực kết hợp đó với các giá trị được lưu trữ và sau đó sử dụng mật khẩu để giải mã mật khẩu cho ứng dụng bên ngoài.

Nếu người dùng không nhập mật khẩu, khi đó bạn bị hạn chế hơn về những gì bạn có thể làm. Bạn có thể xác định khóa bằng cách nào đó từ thông tin có sẵn cho bạn có thể được sử dụng để lưu trữ mật khẩu được mã hóa của người dùng trong một tệp ở vị trí bị hạn chế như thư mục con bên dưới thư mục chính của họ mà không có nhóm hoặc truy cập công khai:

mkdir ~/.appname 
chmod 700 ~/.appname 
cp /dev/null ~/.appname/app.key 
...store the encrypted information... 
chmod 500 ~/.appname 
chmod 400 ~/.appname/app.key 

Đây là chưa thỏa đáng bởi vì ngay cả khi bạn kết hợp một phím cố định với tên của người dùng, chẳng hạn, các cơ hội được rằng ai đó có thể tìm ra những gì quan trọng mà là (và các công nghệ mã hóa) và thiết kế đối chiếu nó. (Bí mật của dữ liệu được mã hóa phụ thuộc vào các khóa, khi khóa được xác định bởi chương trình, nó cũng có thể được xác định bởi kẻ tấn công được xác định. Tốt nhất là, cho đến nay, dựa vào người dùng để cung cấp khóa (hoặc mật khẩu hoặc vượt qua cụm từ) tại thời gian chạy, sau đó ứng dụng không lưu trữ bất cứ điều gì mà một kẻ tấn công có thể sử dụng ẩn

+0

Tôi sử dụng mật khẩu đó để truy cập một số cơ sở dữ liệu web, vì vậy tôi cần nó được lưu trữ trong ứng dụng của tôi sau khi nó được nhập lần đầu tiên. Bạn có chắc tệp văn bản thuần túy là ý tưởng thông minh không? –

+0

để tôi thấy nó là bản ghi vĩnh viễn là ý tưởng tốt nhất cho đến bây giờ. ứng dụng không có bất kỳ mật khẩu nào khác và không đồng hồ mà người dùng khác sẽ sử dụng ứng dụng đó. điều duy nhất là thử lưu mật khẩu + tên người dùng từ ppl khác. –

+0

Có, lưu trữ thông tin trong một số tệp vĩnh viễn sẽ là cần thiết. Sử dụng một tệp riêng cho từng người dùng của ứng dụng; lưu trữ mật khẩu được mã hóa trong mã hóa Base-64 (vì vậy bạn có tệp văn bản thuần túy). Lấy chìa khóa được sử dụng để mã hóa từ mã băm mật mã của bất kỳ thứ gì bạn cho là đặc điểm đáng tin cậy nhất của người dùng (có thể là nối tên người dùng và số ID người dùng và có thể một số văn bản cố định). một vị trí như bạn có thể nghĩ ra. Bảo mật ít hơn hoàn hảo - những gì bạn có thể đưa ra những kẻ tấn công có thể khám phá. –

0

loại ứng dụng nào? Có nhiều phương pháp nhưng nếu ASP.Net của nó là phổ biến để mã hóa trong tệp web.config.

+0

Ứng dụng nền tảng C++ (không phải một số ứng dụng web) –

5

Thông thường, bạn lưu tên người dùng và phiên bản băm mật khẩu. Xem bài viết wikipedia này: hash functions và điều này question.

+2

Mật khẩu sẽ không hỗ trợ nếu bạn cần sử dụng mật khẩu thực tế sau này để đăng nhập vào hệ thống từ xa hoặc tương tự. –

+0

Hoàn toàn ..... – Peter

1

gì về MySQL hoặc SQLite băm mật khẩu và lưu trữ chúng trong một cơ sở dữ liệu dai dẳng, không

1

Common.? phương pháp lưu trữ mật khẩu để sử dụng sau này là lưu trữ chúng trong một số bộ nhớ đệm được mã hóa, bộ nhớ cache được mã hóa bằng một số mật khẩu chủ, người dùng phải nhập mật khẩu chủ mỗi lần bạn cần mật khẩu từ bộ nhớ cache. lưu trữ dữ liệu cá nhân (tên người dùng, p asswords, vv) Nó có giao diện ánh sáng, là nền tảng chéo và được xuất bản theo các điều khoản của Giấy phép Công cộng GNU. Bạn có thể kiểm tra nó như là mẫu và sử dụng một số phần của nó.

0

Tại spotep.com, chúng tôi chỉ lưu tên người dùng và mã băm của tên người dùng được kết hợp với mật khẩu. Lợi ích của việc này là mật khẩu similair (thường nhỏ) sẽ không dẫn đến cùng một hashcode (được lưu trữ trong cookie và do đó rất không an toàn).

+0

trang web đẹp nhưng bạn đã bỏ lỡ rất nhiều chuỗi ở đó caprica, battlestar galactica, con trai của tình trạng hỗn loạn, ... –

+0

Hmm, Không, chúng tôi không? –

1

Tôi khuyên bạn nên lưu trữ mật khẩu được băm trong SQLite. Sau đó, bất cứ khi nào bạn cần phải kiểm tra một mật khẩu, băm nó và sau đó so sánh nó với giá trị được lưu trữ. Điều này giữ cho mật khẩu được lưu trữ an toàn để không ai (thậm chí không bạn) biết chúng là gì.

1

Bạn có thể thử QSettings cung cấp các cài đặt ứng dụng độc lập nền tảng liên tục. Các giải pháp như mysql sẽ là quá mức cần thiết trừ khi bạn có hàng trăm mật khẩu để lưu trữ.

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