我的任务是对Java应用程序进行密码保护,而不必担心真正的安全性。因此,将用户名/密码对存储在文本文件中,然后对其进行加密似乎是明智之举。对于加密来说,使用XOR密码似乎是合适的,因为它们既简单又快速(记住——它只是要阻止临时用户,而不是防弹的)。在
我编写了所有合适的Java,然后意识到我需要一种加密配置文件的方法。我编写了一个附加的方法,但是使用不止一次或两次是很笨拙的(而且似乎只对一些输入有效),所以我决定最好用Python编写一些东西,在REPL中使用。在
我最后得出的结论是:
from itertools import izip, cycle
KEY = "stackoverflow"
def encrypt(text):
return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in izip(text,cycle(KEY)))
def decrypt(text):
return encrypt(text)
def export(users, file):
with open(file, "w") as f:
for user, password in users.items():
f.write(encrypt('"%s" "%s"'%(user, password)) + "\n")
def import_data(file):
with open(file) as f:
return [decrypt(i) for i in f.readlines()]
表面上,它起作用:
^{pr2}$但后来事情开始分崩离析:
>>> export({"foo" : "bar", "baz" : "quux", "spam" : "eggs"}, "users.dat")
>>> import_data("users.dat")
['"foo" "bar"e', '"baz" "quux"}', '"spam" "eggs"y']
维姆是这么读的-
然后:
>>> export({"what" : "not", "this" : "that", "admin_istrator" : "quux"}, "users2.dat")
>>> import_data("users2.dat")
['"thi', "k97$ma{~'l", '"what" "not"}', '"admin_istrator" "quux', '7~']
维姆:
我突然想到,我可能有一个问题,一个字符的加密形式是一个新行,但据我所见,这并不能解释第一个例子中的古怪行为,也不能解释第二个例子中的古怪行为。在
关于新行,我的计划B是加密整个文件——新行和全部——然后将其删除,解密,在“\n”上拆分,然后继续基于行的解析。在
提前谢谢。在
更新:这是我对B计划的实施(两段前描述过)。在
def import2(file):
with open(file) as f:
return decrypt(f.read())
然后:
>>> export({"foo" : "bar", "this" : "that", "admin_istrator" : "letmein"}, "users2.dat")
>>> import2("users2.dat")
'"this" "that"y%smg&91uux!}"admin_istrator" "letmein"y'
更新二:二进制。在
[代码与上面相同,只是所有open
都是open(file, "rb")
或{
>>> export({"foo" : "bar", "this" : "that", "admin_istrator" : "letmein"}, "users2.dat")
>>> import2("users2.dat")
'"this" "that"y%smg&91uux!}"admin_istrator" "letmein"y'
>>> import_data("users2.dat")
['"t', "k97$ma{~'", '"foo" "bar"', '"admin_istrator" "letmein"']
最后更新:64基地,其他恶作剧。在
def import2(file):
with open(file, "rb") as f:
return filter(str.strip, [decrypt(i) for i in f.readlines()])
其中encrypt
和decrypt
encode
在/decode
基64中。在
您试图在文本模式文件中存储二进制文件。使用
open(file, "wb")
进行写入,使用open(file, "rb")
进行读取,以二进制模式打开文件并修复问题。在在文本模式下,每个
"\r"
、"\n"
和"\r\n"
序列被视为新行,因此它们被转换为本地操作系统行结束约定("\r\n"
对于Windows,"\n"
对于Unix,"\r"
对于旧Mac)。如果您从文本文件中读取它们,您将始终得到"\n"
,如果您编写它们,我不记得实际的行为,但您肯定也会得到混乱而不是您的数据:)使用XOR加密,很可能会遇到这种情况:)
如果您被迫使用二进制文件,请尝试base64编码(例如
"some\0te\n\nxt with bi\x01naries".encode('base64')
)。要解码,请使用.decode
(谢谢,显然是船长!)。在你在读取数据的过程中,不只是读取了数据的加密问题
您可以通过加密新行而不在行之间重置密钥来修复它
这应该转换成一个类,
key
将是一个实例变量,而不是像这里这样的全局变量相关问题 更多 >
编程相关推荐