Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在哪里存储密码?_Android_Database_Passwords - Fatal编程技术网

Android 在哪里存储密码?

Android 在哪里存储密码?,android,database,passwords,Android,Database,Passwords,我正在编写一个android密码管理器应用程序,我想将主密码存储在某个地方,但我不知道在哪里。我应该用我选择的硬编码密码加密用户给我的主密码,然后将其存储到数据库中吗?还是我应该做点别的 您不应该存储未加密的密码 对于无法安全加密的密码(因为必须将解密密钥存储在某个位置),应该只存储其不可恢复的散列 这样,当用户向您提供密码时,您可以将密码与哈希值进行比较。如果匹配,您可以使用给定密码解密存储的user:password对 附言:别忘了给土豆条加盐,还有。不,不,一千次不 如果允许您查看GPLv

我正在编写一个android密码管理器应用程序,我想将主密码存储在某个地方,但我不知道在哪里。我应该用我选择的硬编码密码加密用户给我的主密码,然后将其存储到数据库中吗?还是我应该做点别的

您不应该存储未加密的密码

对于无法安全加密的密码(因为必须将解密密钥存储在某个位置),应该只存储其不可恢复的散列

这样,当用户向您提供密码时,您可以将密码与哈希值进行比较。如果匹配,您可以使用给定密码解密存储的user:password对


附言:别忘了给土豆条加盐,还有。

不,不,一千次不

如果允许您查看GPLv2代码,请查看KeePass源代码

主密码转换为密钥(基于密码的密钥派生),该密钥用于加密和解密单个数据段(单个密码)

因此,过程与此类似: 1.关闭任何可以关闭的磁盘交换。向用户询问主密码

  • 通过使用PBKDF2(HMAC-SHA-256,主密码,随机存储的salt*,2000000,256),将主密码转换为仅存储在内存中的主加密密钥—PBKDF2也称为RFC2898和PKCS#5。HMAC-SHA-256是散列函数。主密码是用户输入的任何内容-根本不会以任何形式保存!存储的随机salt是一个64位或更大的加密随机值,每当选择一个新的主密码时都会以新的方式生成,并保存,而不是保存任何形式的主密码。2000000是我们将运行HMAC的次数,它是存储的,并且应该是用户可选择的-这应该是您可以等待的次数(KeePass有一个函数来对它们进行基准测试,并查看需要1秒的时间-我建议将其增加到4或5秒)。256是所需的输出位数-在本例中,我假设您将使用CAMELLIA-256或AES-256对密码进行加密(只需匹配加密函数用于密钥的位数)。 是的,可以改用scrypt或bcrypt

  • 检查主密码是否正确:如果使用现有主密码进入现有数据库,请使用该内存专用密钥解密某些固定数据,如“默认”密码。如果值解密为您期望的值,则表示输入的主密码正确,否则表示主密码错误和/或数据库损坏。如果要启动新数据库或更改主密码,请加密该“默认”密码并存储加密值

  • 使用主加密密钥解密URL、用户名、注释和其他非密码数据

  • 使用主加密密钥仅根据用户的请求解密现有密码(但仅解密用户请求的精确密码),然后在数据处理完毕或计时器用完后立即使用随机垃圾覆盖数据。使用所述主加密密钥加密新密码

  • 一旦用户完成或计时器用完,就用随机垃圾覆盖所有变量(尤其是仅内存中的主加密密钥)

  • 请注意,您正在存储:

    • 迭代次数
    • 加密的“固定”密码,仅用于验证主密码是否正确
    • 加密的用户名、URL、注释等
    • 加密的个人站点密码

    您永远不会存储主密码或其散列。您永远不会将主密码、其散列、甚至生成的主加密密钥与任何其他内容进行比较。您只需获取主密码并将其转换为主加密密钥,然后使用该密钥加密或解密数据-已知数据(“固定”密码)可让您查看该密钥是否给出了预期的结果。当您知道主密码正确时,未知数据(用户输入和关心的所有内容)也会被加密或解密。

    密码管理器的全部思想不就是不存储主密码吗?使用主密码作为加密密钥存储各个密码。而且主密码从未被存储。我建议你重新阅读他的问题。创建密码管理器时,必须存储原始密码;)除非目标支持哈希,否则哈希不是选项。@WoLpH:您可以使用主密码加密密码。但是,您不必存储主密码。只要存储它的散列就足够了。斯科利:我看到你修改了你原来的答案。现在它是正确的:)+1