我有一个登录数据库,从我的Android客户端我必须以安全的方式传递密码。我想实现一个能够加密的登录界面。
如何在我的应用程序中实现安全加密?
答案 0 :(得分:13)
你想要完成它仍然有点模糊,因为我没有真正理解你所说的“能够进行加密的登录屏幕”。
如果我理解正确,虽然我猜你想要在你的应用程序中有一个用户需要通过的登录界面才能使用你的应用程序。有点像进入建筑物的门,还是栅栏?好吧,我不能确切地告诉你如何实现它,但也许可以启发一些问题。
用户输入他或她的用户名和密码,检查用户是否存在于数据库中,并将密码与数据库中的密码进行比较。
简单但不安全。在这种情况下,您需要以明文存储密码,这意味着其他人(让她称之为邪恶的Eve )可以创建另一个应用程序,从数据库中读取并获取密码。
要缓解这个问题,您可以hash输入密码(最好加盐)。要散列字符串,请查看MessageDigest类,可以通过链接获得示例。现在,使用哈希意味着你(引用维基百科)
将大量可能可变大小的数据转换为小数据
即。你获得的数据不是你给哈希函数的数据。哈希是一种快速的单向函数,因此一旦您对其进行哈希处理,您将无法获得实际密码。但没问题,将密码的哈希值存储在数据库中,并在登录时比较密码的哈希。
这比明文要好一些,邪恶的Eve可能会从数据库中读取,但它不是她需要在您的应用程序中输入的密码才能登录。不要担心邪恶的夏娃,“我只会得到一个{ {3}}“她说,”并将我的彩虹表与数据库中的密码进行比较“。
如此接近......好吧,为了减轻Rainbow table你可以使用一个盐,换句话说,添加到密码的另一个值将创建一个不同的哈希值。散列的美妙之处在于,您只需要添加少量额外数据,以使散列看起来几乎随机地与散列不同,而不需要额外的数据位。简单的salt可以是用户名,存储hash(username + password)
而不是hash(password)
。现在,由于哈希计算速度很快,盐应该以某种方式隐藏。你是如何做到的rainbow attack,但你应该强调秘密。
邪恶的夏娃现在非常生气,但她可能只能找到你的盐,在这种情况下,她只是在她睡着时离开她的电脑,当她醒来时她会可能有破解密码。
由于哈希函数很快,为什么不只是哈希密码的哈希值,而且因为它们很快,为什么不哈希密码哈希值?嘿,虽然我们在这,但为什么不这样做呢。 用户 要等多久才能登录?如果可以等一下,那么你可以在那一秒内完成多少次迭代?在completely up to you中阅读一些答案可能会给出一些理由,越多越好。将其与盐减缓相结合,它应该非常可靠。
嗯,邪恶的夏娃现在将很难穿透你的登录界面,用盐和迭代对所有密码进行哈希处理。
但请记住,你的防守与你最薄弱的环节一样强大!问自己这个问题,我想保护什么?我的登录屏幕会保护它吗?如果恶棍无法破门,this stackoverflow thread!
如果您想了解有关Java安全性的更多信息,可以阅读有关they might just go through the hedge和security in Java的更多信息。