2011-10-03 60 views
3

我正在创建一个应用程序,要求用户注册一个远程服务器,但我想在发送它之前散列它们的密码以存储在我的数据库中。在Android应用程序中散列密码的一些好方法是什么?

我尝试过使用jBCrypt库,但它在散列时创建了一个漫长的挂起时间。还有其他的选择吗?散列密码的最佳(最安全)方法是什么,而不会造成明显的挂起?

+0

为什么不使用ssl? –

+0

@ DanielA.White:这不需要我有一个有效的SSL证书吗?我目前没有其中之一。 – WilHall

+0

@WilHall更不用说,SSL证书很贵。 –

回答

4

你的方法似乎是错误的。除非你有一些特殊的要求,通常的方式做,这是下面的(不是Android的特异性,对于任何Web应用程序):

  1. 当用户注册时,把他们的密码,哈希它(使用随机盐也建议使用),并将其保存在数据库中。这样做是为了避免将实际密码保存在数据库中。
  2. 当用户需要登录时,您将实际密码发送到您的webapp(使用SSL以避免发送明文),而不是的散列。 在服务器上,应用与步骤1中相同的散列算法,并将结果与​​数据库中的结果进行比较。如果它们相同,则用户提供了正确的密码。

总之,你应该在服务器上做哈希,而不是在Android设备上。

+0

我目前正在做的是: 注册:获取密码输入,哈希,发送到服务器,存储它。 登录:获取密码输入,哈希值,将其发送到服务器,比较它 你是说我应该使用SSL发送纯文本密码,然后将它散列在服务器上?这不需要我的域的SSL证书吗? – WilHall

+2

是的。请注意,你现在正在做的事情是不安全的:如果有人拦截了流量,他们会得到散列,而不是实际的密码,但他们并不需要它。只要攻击者拥有散列,他们就可以在不知道密码的情况下将其发送到服务器并成功登录。请使用SSL。 –

0

不惜任何代价避免保存第三方密码。保存它们被认为是一种网络钓鱼。尝试保存认证令牌,而不是使用OAuth等方法获得的原始密码。

如果您确实需要将密码发送到Web服务器上的数据库,请使用HTTPS。这将确保通过电线进行安全的加密。然后您可以根据需要在数据库中加密密码。此方法还可以确保您的加密机制不在设备本身上,而且可能更容易受到危害。

相关问题