代码之家  ›  专栏  ›  技术社区  ›  Ads

如何实现加密的Android登录认证?

  •  4
  • Ads  · 技术社区  · 15 年前

    我有一个登录数据库,从我的Android客户端,我必须以安全的方式传递密码。我想实现一个能够进行加密的登录屏幕。

    如何在我的应用程序中实现安全加密?

    1 回复  |  直到 15 年前
        1
  •  13
  •   Community Mohan Dere    9 年前

    它仍然有点含糊,你想要完成什么,因为我不真正明白你所说的“登录屏幕,它可以做加密”。

    如果我理解正确的话,尽管我猜您希望在您的应用程序中有一个登录屏幕,您的用户需要通过该屏幕才能使用您的应用程序。有点像进入建筑物的门,或者栅栏?好吧,我不能确切地告诉你如何完成它,但可能会启发一些问题。

    第一次尝试纯文本FTW,还是?

    用户输入其用户名和密码,检查数据库中是否存在用户,并将密码与数据库中的密码进行比较。

    简单,但不那么安全。在这种情况下,您需要以明文存储密码,这意味着其他人( 我们叫她邪恶的夏娃吧 )可以创建另一个应用程序,从数据库中读取并获取密码。

    缓解步骤1“散列

    为了缓解这种情况,你可以 hash 您的密码(最好用盐)。要散列字符串,请查看 MessageDigest 类,通过链接提供了一个示例。现在,使用hash意味着你(引用维基百科)

    将大的、可能大小可变的数据量转换为小的数据量

    也就是说,你得到了一些数据,而不是你给出的散列函数。散列是一种快速, 单向函数 所以,一旦散列了密码,就不会再得到实际的密码。但没问题,将密码的散列存储在数据库中,并比较 搞砸 登录时的密码。

    这比纯文本要好一些,Evil可能从数据库中读取数据,但这不是她登录应用程序时需要输入的密码。不用担心邪恶的夏娃,“我会得到一个 Rainbow table “她说,”然后将我的彩虹表与数据库中的密码进行比较。

    缓解步骤2用盐散列

    这么近…为了减轻 rainbow attack 您可以使用salt,也就是说,添加到密码的另一个值将创建不同的哈希。散列的好处在于,您只需要添加少量的额外数据,就可以使散列看起来与没有额外数据位的散列几乎是随机的不同。一个简单的salt可以是用户名,store hash(username + password) 而不是 hash(password) . 现在,由于哈希计算速度很快,所以应该以某种方式隐藏盐。你是怎么做的 completely up to you 但你应该让它成为秘密。

    邪恶的夏娃现在很生气,但是她 可以 只要能找到你的盐,在这种情况下,她只是让她的电脑运行时,她睡着了,当她醒来时,她很可能有一个破解密码。

    缓解步骤3迭代是你的朋友

    既然散列函数很快,为什么不只是散列密码的散列,既然它们很快,为什么不散列密码的散列呢?嘿,当我们在做的时候,为什么不这样做呢? 用户应该多长时间 有 要在登录前等待吗? 如果可以等待一秒钟,那么您可以在那一秒钟内完成多少次迭代?阅读一些答案 this stackoverflow thread 可能会给你一些理由,越开心。再加上盐的减少,它应该是相当坚实的。

    好吧,邪恶的夏娃现在很难进入你的登录屏幕,用盐和迭代来散列密码。

    其他问题

    但是记住, 你的防守和你最薄弱的环节一样强大! 问问你自己,我想保护什么?我的登录屏幕会保护它吗?如果坏人不能破门而入, they might just go through the hedge !

    你可以阅读更多关于 security in Java 以及 Cryptography Architecture 如果你想了解更多关于爪哇的安全问题。