Mật khẩu Python an toàn

Tôi là người hoang tưởng. Tôi không muốn chia sẻ mật khẩu của mình với người quản lý mật khẩu. Tôi không muốn viết chúng ra hoặc gõ chúng ở bất cứ đâu

Tôi thậm chí không muốn nhìn thấy chúng bằng chính đôi mắt của mình, bao giờ hết

tôi không muốn nhớ đến họ. Tôi muốn mỗi người và tất cả mọi người là duy nhất với 17 ký tự, với tất cả những quy tắc buồn cười đó về việc có ít nhất một chữ hoa, một chữ thường, một chữ số, một ký tự đặc biệt, v.v.

Tôi không muốn chương trình keylogger có thể chặn mật khẩu của mình. Và tôi không bao giờ muốn mất bất kỳ mật khẩu nào của mình

Tôi có đòi hỏi quá nhiều không?

à há

Gần đây, khi đang loay hoay với các ý tưởng lập trình Python, tôi lại có một tia sáng khác “Aha. ” thời điểm, và mã trong bài viết này được sinh ra. Có, nó đáp ứng tất cả các yêu cầu nêu trên. Hãy để tôi giải thích

Một số bối cảnh

Đầu tiên, trước khi tôi đi sâu vào phần giải thích về chương trình, đây là một ví dụ về cách bạn sử dụng nó

Khi bạn được nhắc nhập mật khẩu, hãy sao chép toàn bộ URL của trang web bạn đang truy cập vào khay nhớ tạm

Chạy chương trình urlpassword.py. Nó sẽ hoạt động, yêu cầu khóa cá nhân ngắn của bạn, sau đó biến mất rất nhanh, không có mật khẩu hoặc bất kỳ thứ gì khác ngoài khóa của bạn hiển thị trên màn hình. Cuối cùng, chỉ cần dán từ khay nhớ tạm của bạn vào trường mật khẩu và bạn đã hoàn tất

Làm thế nào nó hoạt động

Trong hầu hết các trường hợp, mật khẩu là duy nhất cho miền mà bạn đang đăng nhập từ đó

Hãy xem URL hoặc dòng địa chỉ web trong trình duyệt của bạn khi bạn đang đăng nhập ở một nơi nào đó và bạn sẽ thấy địa chỉ miền chính bắt đầu bằng một cái gì đó như // và theo sau là một số dữ liệu bổ sung xác định chính xác bạn đang ở đâu trong miền đó

Ví dụ: khi bạn đăng nhập vào Amazon, tên miền chính là www.amazon.com, đối với Google là www.google.com, v.v. Với Python, thật dễ dàng trích xuất chuỗi miền lõi đó từ URL đầy đủ, bất kể đó là gì. Nhưng tên miền chỉ là một phần của những gì được sử dụng để tạo mật khẩu duy nhất của bạn

Chương trình urlpassword.py được sửa đổi dành riêng cho bạn. Rất đơn giản để thay đổi mã và tôi sẽ chỉ cho bạn chính xác cách thức và vị trí thay đổi mã sau một chút nữa

Nếu ai đó muốn lấy bản sao chương trình này từ máy tính của bạn, họ vẫn cần biết khóa của bạn [số pin ngân hàng là lý tưởng, nhưng bất kỳ chuỗi ngắn nào dễ nhập và dễ nhớ đều hoàn hảo] nếu không họ sẽ tạo ra một

Ảnh của MinuteKEY trên Bapt

Tương tự như vậy, một kẻ xấu đã lấy chìa khóa của bạn thông qua chương trình key-logger vẫn cần lấy bản sao của chương trình này từ máy tính của bạn. Sẽ mất cả hai phần để bẻ khóa mật khẩu của bạn

mật khẩu url. mã py

Đây là mã nguồn chính của chương trình này. Lưu ý rằng nó nhập hai mô-đun khác và tôi sẽ giải thích những mô-đun tiếp theo

import pyperclip
from prb import *
url = pyperclip.paste[]
domain = url.split["/"][2].lower[]
key = input[f"{domain} .. Enter your key: "]
prb = Prb[domain + key]
a1 = "abcdefghijklmnopqrstuvwxyz"
a2 = a1.upper[]
a3 = "1234567890"
a4 = "!#$%*^&@~"
a5 = a1 + a2 + a3 + a4
pw = []
pw.append[a1[prb.next_byte[] % len[a1]]]
pw.append[a2[prb.next_byte[] % len[a2]]]
pw.append[a3[prb.next_byte[] % len[a3]]]
pw.append[a4[prb.next_byte[] % len[a4]]]
n = 0
while len[pw] < 17:
n += prb.next_byte[n]
n %= len[a5]
pw.insert[prb.next_byte[] % [len[pw] + 1], a5[n]]
pw = "".join[pw]
pyperclip.copy[pw]

Chuỗi URL được lấy từ khay nhớ tạm của hệ thống và tên miền được trích xuất trong một vài dòng đầu tiên

Bạn được nhắc nhập khóa của mình ở dòng tiếp theo và sự kết hợp giữa chuỗi miền và khóa của bạn được sử dụng để khởi tạo đối tượng Prb [byte giả ngẫu nhiên]

Tất cả các ký tự mà bạn có thể muốn trong mật khẩu mới của mình được lưu trữ trong các chuỗi từ a1 đến

class Prb:
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]]
def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
0

Nếu bạn muốn thêm hoặc xóa bất kỳ ký tự nào, vui lòng thực hiện tại đây. Danh sách

class Prb:
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]]
def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
1 được tạo bằng cách nối thêm một ký tự đầu tiên từ mỗi chuỗi đó. Điều này đảm bảo ít nhất một từ mỗi bộ

Vòng lặp while sử dụng các byte giả ngẫu nhiên để chèn các ký tự bổ sung tại các vị trí ngẫu nhiên vào danh sách

class Prb:
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]]
def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
1, cho đến khi danh sách có 17 ký tự trong đó

Vui lòng thay đổi

class Prb:
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]]
def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
3 thành bất kỳ độ dài mật khẩu nào, bạn có thể muốn. Cuối cùng, danh sách này được nối với nhau thành một chuỗi mật khẩu duy nhất và sau đó được đưa vào khay nhớ tạm của hệ thống sẵn sàng để bạn dán vào

kẹp kim loại

Lưu ý rằng mô-đun

class Prb:
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]]
def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
4 được nhập bởi chương trình này

Một

class Prb:
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]]
def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
5 đơn giản và chỉ dùng một lần sẽ thêm thư viện này vào bản cài đặt Python của bạn

Bạn có thể tìm hiểu thêm về

class Prb:
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]]
def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
4 tại trang Pypi của nó tại đây. Về cơ bản, điều này bổ sung khả năng lấy dữ liệu từ khay nhớ tạm của bạn và đưa dữ liệu trở lại vào đó. Tôi luôn sử dụng nó cho rất nhiều chương trình Python tiện ích

Các byte giả ngẫu nhiên tốt như thế nào?

Lớp Prb cũng được nhập trong mô-đun

class Prb:
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]]
def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
8. Đây là danh sách mã trước khi tôi giải thích nó

class Prb:
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]]
def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q

Lớp này duy trì một danh sách, tên là

class Prb:
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]]
def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
9, gồm 256 số nguyên nằm trong khoảng từ 0 đến 255. Các biến
Want to Connect?John’s passion and mission are sharing Python code to help demystify life’s challenges and to have fun. John is the author of Python for Numworks , Python for OpenSCAD, Python for the TI-Nspire CX II, Python for the TI-84 Plus CE Python calculator , and many other titles.
0 và
Want to Connect?John’s passion and mission are sharing Python code to help demystify life’s challenges and to have fun. John is the author of Python for Numworks , Python for OpenSCAD, Python for the TI-Nspire CX II, Python for the TI-84 Plus CE Python calculator , and many other titles.
1 là các chỉ mục trong danh sách này

Với mỗi cuộc gọi đến

Want to Connect?John’s passion and mission are sharing Python code to help demystify life’s challenges and to have fun. John is the author of Python for Numworks , Python for OpenSCAD, Python for the TI-Nspire CX II, Python for the TI-84 Plus CE Python calculator , and many other titles.
2, các chỉ mục và thứ tự của các mục trong danh sách được chọn ngẫu nhiên dựa trên số nguyên được truyền tùy chọn
Want to Connect?John’s passion and mission are sharing Python code to help demystify life’s challenges and to have fun. John is the author of Python for Numworks , Python for OpenSCAD, Python for the TI-Nspire CX II, Python for the TI-84 Plus CE Python calculator , and many other titles.
3

Thay đổi dù chỉ một bit của số b được truyền vào phương thức này và chuỗi byte đầu ra được thay đổi hoàn toàn về sau

Tùy chỉnh cho bạn và bạn một mình

Nhớ lại rằng chuỗi gốc được sử dụng để khởi tạo trình tạo byte giả ngẫu nhiên này được truyền từ chương trình chính — và nó chứa miền hiện tại và khóa của bạn

Điều này được kết hợp với chuỗi

Want to Connect?John’s passion and mission are sharing Python code to help demystify life’s challenges and to have fun. John is the author of Python for Numworks , Python for OpenSCAD, Python for the TI-Nspire CX II, Python for the TI-84 Plus CE Python calculator , and many other titles.
4 được hiển thị ở trên, chuỗi này xác định rõ ràng bạn là duy nhất và một tập hợp bất kỳ ký tự ít nhiều ngẫu nhiên nào khác mà bạn muốn đưa vào thông qua chuỗi có tên duy nhất

Chuỗi kết hợp dài này sau đó được đưa vào phương thức

Want to Connect?John’s passion and mission are sharing Python code to help demystify life’s challenges and to have fun. John is the author of Python for Numworks , Python for OpenSCAD, Python for the TI-Nspire CX II, Python for the TI-84 Plus CE Python calculator , and many other titles.
2, lặp đi lặp lại, để khởi tạo trình tạo thành một trạng thái hoàn toàn duy nhất. [có nhiều trạng thái độc đáo hơn số electron trong vũ trụ đã biết. Cho đến nay. ]

Bên cạnh đó, tôi đã gửi mã Prb cho một số chuyên gia và họ đã nói rằng nó rất tốt

Ngoài ra, nó đã vượt qua với màu sắc bay bổng sau rất nhiều thử nghiệm rộng rãi bằng cách sử dụng các chương trình thử nghiệm byte giả ngẫu nhiên nổi tiếng khác nhau. Tất nhiên, nó không phải là một thuật toán mã hóa được chứng nhận chuyên nghiệp, nhưng để bảo vệ bằng mật khẩu cá nhân, nó hoạt động cực kỳ hiệu quả và bạn có thể tin tưởng rằng nó không có bất kỳ cửa hậu hay mã bí ẩn nào.

Mật khẩu được tạo bởi chương trình này có khả năng chống lại các cuộc tấn công vũ phu cao. Một tin tặc sẽ cần nắm giữ bản sao chương trình duy nhất của bạn, sau đó dùng vũ lực thông qua tất cả các phím tắt có thể mà bạn có thể chọn

Về mặt lý thuyết, điều đó có thể xảy ra, nhưng hãy so sánh khả năng xảy ra điều đó với các cuộc tấn công vào mật khẩu của bạn thông qua trình ghi khóa, các cuộc tấn công của chương trình quản lý mật khẩu trực tuyến hoặc các diễn biến bất chính khác mà bạn không có nhiều quyền kiểm soát

Tôi khuyên bạn nên tùy chỉnh bản sao của chương trình này bằng cách thay đổi các chuỗi được hiển thị trong lớp Prb, sau đó không thay đổi chúng lần nữa. Bất kỳ thay đổi nhỏ nào cũng sẽ khiến tất cả mật khẩu của bạn khác đi. Lưu một bản sao giấy của chương trình của bạn ở một nơi an toàn, chỉ trong trường hợp bạn cần khôi phục nó vì bất kỳ lý do gì

Có an toàn để lưu trữ mật khẩu trong một biến Python không?

Không có vấn đề gì với việc lưu trữ mật khẩu văn bản thuần túy trong một biến bộ nhớ . Việc một ứng dụng giải mã một mật khẩu an toàn và lưu trữ nó trong bộ nhớ là điều khá phổ biến và sẽ là bình thường.

Mật khẩu của bạn có thể bảo vệ tập lệnh Python không?

Một cách khác để bảo vệ mật khẩu trong Python là băm . Điều này có thể hữu ích nếu bạn đang xử lý việc lưu trữ nhiều mật khẩu, chẳng hạn như thông tin xác thực cho một ứng dụng web [e. g. Flask hoặc Django]. Băm khác với mã hóa ở chỗ mã hóa hoạt động như một phương pháp 2 chiều. Bất kỳ mật khẩu nào được mã hóa đều có thể được giải mã.

Sử dụng kho mật khẩu có an toàn không?

Kho mật khẩu là một cách an toàn để quản lý và lưu trữ mật khẩu doanh nghiệp . Một số kho tiền có thể tự động tạo mật khẩu mạnh, an toàn và duy nhất để bảo vệ các ứng dụng. Thân thiện với người dùng. Người dùng không cần phải nhớ nhiều mật khẩu để đăng nhập vào nhiều tài khoản, chỉ cần một mật khẩu chính mạnh để mở khóa kho tiền.

Có rủi ro khi sử dụng trình quản lý mật khẩu không?

Nhưng không phải tất cả các trình quản lý mật khẩu đều như nhau, từ các tùy chọn miễn phí dựa trên trình duyệt cho đến nhiều cấp độ của dịch vụ bảo mật mật khẩu trả phí. Ngay cả trình quản lý mật khẩu cũng yêu cầu người dùng phải có một mật khẩu chính được bảo vệ chặt chẽ và ngay cả trình quản lý mật khẩu cũng đã bị tấn công , như trường hợp gần đây của LastPass.

Chủ Đề