Java Android安全Pin尝试计数器值

Java Android安全Pin尝试计数器值,java,android,security,encryption,Java,Android,Security,Encryption,我目前正在一个Android应用程序中实现一个自定义pin屏幕登录,用户在被锁定(并返回到完整登录屏幕)之前会有固定次数的尝试。我很难找到安全存储尝试计数器值的最佳方法,这样它就不容易被攻击 目前,我正在以模糊的形式将计数器值存储在共享首选项中。密钥是一个无意义的字符串,值被加密。这里有一个明显的弱点,攻击者可以不断地将共享首选项中的值替换为以前的值,以获得无限次的尝试。他们不需要破坏加密或任何聪明的东西,所以这是一个非常简单的攻击 有没有更好的方法让我俯瞰?我曾经考虑过在其他地方存储一个单独的

我目前正在一个Android应用程序中实现一个自定义pin屏幕登录,用户在被锁定(并返回到完整登录屏幕)之前会有固定次数的尝试。我很难找到安全存储尝试计数器值的最佳方法,这样它就不容易被攻击

目前,我正在以模糊的形式将计数器值存储在共享首选项中。密钥是一个无意义的字符串,值被加密。这里有一个明显的弱点,攻击者可以不断地将共享首选项中的值替换为以前的值,以获得无限次的尝试。他们不需要破坏加密或任何聪明的东西,所以这是一个非常简单的攻击


有没有更好的方法让我俯瞰?我曾经考虑过在其他地方存储一个单独的值,在每次加密失败时更新该值。这使它稍微困难一些,但最终这只意味着攻击者必须在两个位置恢复两个值(因此攻击是相同的,只是稍微难以确定).

为什么不计算散列或其他内容,如果任何人更改任何单个值,都会产生不同的散列码,可用于识别修改并存储散列码,并在运行时进行匹配,以识别可能的攻击,并采取正确的措施或阻止您的响应登录,但我不明白如何才能做到这一点应用任何类型的散列,而不存储另一个值,然后以相同的方式复制该值。我认为最终我能做的最好的事情就是以两种不同的方式存储独立的价值观。我面临着同样的问题。你找到解决办法了吗?我很确定我想出了一些办法,但老实说,我不记得我到底做了什么,而且我已经离开公司很久了,所以我恐怕无法查找代码。我想出了以下解决办法。如果设备已根目录,则允许输入PIN一次,如果设备未根目录,则允许尝试X次。因为只有在根设备上,你们才能弄乱应用程序的数据。我说的对吗?你为什么不计算散列或其他什么,如果任何人更改任何一个值,都会产生不同的散列码,可以用来识别修改,存储散列码,并在运行时进行匹配,以识别可能的攻击,并采取正确的行动或阻止你的响应的登录库,但我不明白怎么做我可以应用任何类型的散列,而无需存储另一个值,然后以相同的方式复制该值。我认为最终我能做的最好的事情就是以两种不同的方式存储独立的价值观。我面临着同样的问题。你找到解决办法了吗?我很确定我想出了一些办法,但老实说,我不记得我到底做了什么,而且我已经离开公司很久了,所以我恐怕无法查找代码。我想出了以下解决办法。如果设备已根目录,则允许输入PIN一次,如果设备未根目录,则允许尝试X次。因为只有在根设备上,你们才能弄乱应用程序的数据。我说得对吗?