代码之家  ›  专栏  ›  技术社区  ›  Community wiki

Android密钥库已停止工作

  •  54
  • Community wiki  · 技术社区  · 3 年前

    就在最近,我在一家钥匙店遇到了问题。我知道关于这个问题已经有很多问题了。我把它们都看完了,还在谷歌上疯狂地搜索。

    错误:

    keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect
    java.io.IOException: Keystore was tampered with, or password was incorrect
        at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:772)
        at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55)
        at java.security.KeyStore.load(KeyStore.java:1214)
        at sun.security.tools.KeyTool.doCommands(KeyTool.java:885)
        at sun.security.tools.KeyTool.run(KeyTool.java:340)
        at sun.security.tools.KeyTool.main(KeyTool.java:333)
    Caused by: java.security.UnrecoverableKeyException: Password verification failed
        at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:770)
        ... 5 more
    

    我正在使用的软件:

    Java语言

    java version "1.7.0_21"
    Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)
    

    日食

    Version: 3.8.0
    Build id: I20120502-2000
    

    最新ADT插件

    最新安卓SDK

    以下是我所知道的:

    • 我没有丢失密码,而且密码从未更改。
    • 我无法取回密码(我知道密码)。
    • 在不发布全新应用程序的情况下,我无法使用其他密钥对现有应用程序进行签名(因此我无法发布任何更新)。

    以下是我所做的:

    • 我已经多次卸载并重新安装Eclipse。
    • 我已经卸载并重新安装了android ADT插件。
    • 我已经删除并重新下载了许多次最新的Android SDK。
    • 我已经卸载并重新安装了JDK7。
    • 我已尝试使用密钥库的备份。
    • 我已经使用“md5sum KEYSTORE”检查了MD5校验和,并与备份进行了比较(相同的MD5输出-未被篡改)。
    • 我曾尝试过强行使用密钥存储(我已经检索到了我知道的密码)。
    • 我创建了一个测试密钥(使用当前设置)并测试了密码,它似乎运行良好(所以有些事情发生了变化)。
    • 我尝试手动导出android.apk,然后尝试对其进行签名(Eclipse之外)。

    以下是我如何导出已签名的应用程序:

    • 通过Eclipse: 使用文件导出>导出>导出Android应用程序。
    • 在JDK7之前: jarsigner-verbose-密钥库keystore文件ALIAS。
    • 使用JDK7: jarsigner-verbose-sigalg MD5withRSA-dedigitalg SHA1-keystore keystore FILE ALIAS。

    还有什么需要弄清楚或尝试的?

    • 一些引用/URL说要删除“trusted.certs”文件?
    • 尝试删除“debug.keystore”?
    • 更新Eclipse或任何Android开发工具会影响我的密钥库吗?
    • 将Java从jdk6更新到jdk7会产生任何问题吗?
    • 无论如何,这是否会打乱或改变jarsigner的工作方式?

    用户建议:

    • 尝试使用JDK6,但我最近能够导出一个应用程序。
    • 已在我的local.properties中检查key.store.password或key.alias.password
    • 在eclipse中自动取消选中构建并清理您的项目
    • 尝试删除工作区中的.metadata文件夹并清除所有临时文件夹。

    总结

    • 密钥存储没有改变,
    • 我有密钥库的密码,
    • 我最近成功导出了一个应用程序,使用:
      • Eclipse 3.8(和Eclipse 4.0+),
      • 最新Java 7,
      • 最新的ADT插件。
    • 我上一次成功导出和构建是在几周前,使用Eclipse 3.8、最新的Android工具和具有相同密码的Java 7。

    更新(2014年6月29日)

    • 我使用过: keytool-list-密钥库keystore 成功地证明并证明我的4把钥匙中有3把是有效的。
    • 我伪造了最后一个密钥,并从密钥库中获得了密码(我已经知道的密码),但当我输入进行签名时,密码不起作用。我使用过: java-jar AndroidKeystoreBrute_v1.02.jar -m 3-k KEYSTORE-d单词列表
    • 奇怪的是,有时当我很快将密码输入eclipse时,我的别名就会出现,我可以成功导出我的应用程序。(我知道这太疯狂了)。
    • 更新了Java版本。

    如果我很快输入密码,有时会起作用。

    似乎打开Eclipse并第一次输入密码可以让我使用密钥库。

    显然,如果所有其他操作都失败了,我将不得不创建一个新的密钥存储。我真的很想解决这个问题,我只是不知道除了用新密钥重新发布之外,现在该怎么办。

    如果密钥无法正确恢复,我可能会在Github上打开它的源代码。


    解决方案(2014年6月29日):

    特别感谢用户Erhannis!

    以下是我所做的:

    每次命令都会出错:

    keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v
    

    由于您告诉我我们可以从Java密钥库(.jks)中提取私钥,所以我进行了更深入的研究,最终使用了该命令的变体。我关注了你发布的链接 here here 以下为:

    keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -deststoretype pkcs12
    

    在提取私钥并存储为PKCS12之后,我想提取了我的私钥并将其放回一个全新的Java密钥库:

    keytool -importkeystore -srckeystore new.keystore -srcstoretype pkcs12 -destkeystore final.keystore -deststoretype jks
    

    参考文献:

    http://developer.android.com/tools/publishing/app-signing.html#signapp

    http://code.google.com/p/android-keystore-password-recover/

    我已阅读的StackOverflow URL列表:

    How to handle a lost KeyStore password in Android?

    Invalid Keystore problem?

    Android: I lost my android key store, what should I do?

    I lost my .keystore file?

    Forgot Keystore password, thinking of Brute-Force detection. will it corrupt the keystore?

    I have lost the password for android Keystore file

    Problem running my signed, release keystore in Eclipse

    Android - Forgot keystore password. Can I decrypt keystore file?

    Android release keystore issue: "Keystore was tampered with, or password was incorrect"

    8 回复  |  直到 9 年前
        1
  •  9
  •   Erhannis    9 年前

    我可能也有同样的问题。我从来没有弄清楚它为什么会失败(尽管我想知道这是否是因为密钥库密码短于6位数),但我能够将我的密钥复制到一个新的密钥库中,然后我将其重命名以替换旧的密钥库,然后它神秘地工作了(使用新密码)。顺便说一下,需要密钥密码。下班 https://security.stackexchange.com/a/3795 ,我做了以下操作:

    1. keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -v
    2. 两次输入新的密钥库密码
    3. 进来 当它询问我源密钥库密码时(将其留空)
    4. 输入密钥密码

    在反复检查新的是否有效后,我只是把它复制到旧的上面。希望它对你有用;祝你好运

        2
  •  5
  •   Gerhat    9 年前

    我也遇到了同样的问题,我尝试了这个线程中建议的一切,但没有什么能保存我的别名密码。重点是我 绝对确定 关于密码,因为我已经更新了四次应用程序。我得到了 密钥存储被篡改或密码不正确 消息

    解决方案

    看来,在使用eclipse创建密钥库时, 密码前面添加了一个空格字符!

    这个讨厌的错误显然在后来的版本中得到了修复,导致我无法使用我认为正确的密码登录我的应用程序。

    基于此SO链接: Ant fails to build signed apk after updating to android v20 我建议你 尝试在密码之前或之后添加空格字符

        3
  •  3
  •   Silverstorm    13 年前

    尝试删除 .元数据 文件夹,并清除所有临时文件夹。如果你的密钥库文件没有损坏,并且你已经尝试正确地重新安装Eclipse、ADT、Android SDK和Java SDK,我看不出这个奇怪问题的其他可能原因,除了元数据缓存文件和/或一些临时损坏。

    另一个建议

    尝试使用 Portecle 用于管理和检查密钥库、密钥、证书、证书请求、证书吊销列表等的实用程序。

        4
  •  1
  •   Ajay Kumar Meher    13 年前

    我建议再进行几次预赛和试训。

    请耐心应用这些,

    步骤:

    1. 在eclipse中自动取消勾选构建(Project->build automatically)并清理您的项目。
    2. 重新构建它。(右键单击项目+构建项目)
    3. 导出项目。
    4. 选择Android导出。(为您自动对齐)
    5. 选择您的密钥。提供密码。别名应该在列表中。(确保盖帽锁紧)。有时我们会给出正确的密码,但由于上限的原因,它总是失败;)
    6. 让我知道它是否适合你。

    希望这对你有帮助。

        5
  •  0
  •   Alexander Lucas    13 年前

    您是否在local.properties文件中存储key.store.password或key.alias.password等值?这两个都不正确吗?

    我很好奇用JDK6创建并在JDK7中验证的密钥是否出现了一些错误——这可以解释为什么您为测试创建的新密钥有效,但旧密钥无效。试着降级到JDK6,看看是否能修复它——其他人在JDK7中遇到了不和谐的问题,当他们降级到6时,这种问题就消失了。如果有效,请提交一份错误报告并要求提供补丁,这样您就可以安全地升级到Java 7:)

        6
  •  0
  •   Nik Sanghvi    10 年前

    我最近也在与这个问题作斗争,并尝试了这里和其他地方列出的所有建议。最后,我发现了一个愚蠢的错误,导致了我的错误——我想在这里分享这个,以防它对你们任何人都有帮助。

    如果像我一样,您的机器上有多个Java版本,并且在最初创建密钥库到现在尝试签署APK之间升级了JRE/JDK,则更可能出现这种情况。

    出于某种原因,我们的编译指令引用了完整的Java路径,如下所示:

    C: \Progra~1\Java\jdk1.6.0_45\bin\jarsigner-verbose-sigalg SHA1 with RSA-destisalg SHA1-keystore cre80ve.keystore unsigned.apk cre80ve

    上面的一个建议让我想到,这可能根本不是密码问题,可能是版本不兼容导致了这个问题。所以我运行了以下命令:

    keytool-list-密钥库cre80ve.keystore

    使用我知道的正确密码,瞧,它确认了这是正确的密码。

    然后,我在(旧的)Java版本的路径中删除了显式引用。这使它自动获取最新版本的Java(在我的情况下是jdk1.8.0_31):

    jarsigner-verbose-sigalg SHA1 with RSA-destisalg SHA1-keystore cre80ve.keystore unsigned.apk cre80ve

    一切都很顺利!

    底线:这可能根本不是密码问题,而是不同版本的Java或Android SDK造成的问题,所以记得检查一下。

    一旦它开始工作,请记住将密钥库和密码备份到一个安全的地方:-)

        7
  •  0
  •   Malak Pete    10 年前

    我的密钥别名突然停止工作。(好的,在Android Studio和Java的几次更新之后)。

    我尝试了这个线程和其他线程的所有解决方案。就我而言,解决方案令人惊讶。 我有一个几乎没有别名的密钥库。除了一个密码和密钥库相同的密码外,其他都不起作用。但不幸的是,它不是我需要的。这让我思考得毫无逻辑。 我用将单个别名复制到新的密钥库

    keytool -importkeystore -srckeystore old.keystore -destkeystore new.keystore -srcalias importantalias
    

    然后我将别名密码更改为与密钥库的密码相同的密码:

    keytool -keypasswd -keystore new.keystore -alias importantalias
    

    我终于能够签署我的apk了。 它看起来像一个愚蠢的bug,可以浪费一天的开发时间。

        8
  •  0
  •   Magnus    8 年前

    只是遇到了这个问题——突然间,安卓工作室忘记了我的密码,不会使用我在gradle文件中的密码。6年来,我在同一个项目中使用了相同的密钥文件和密码!

    所以我手动输入了它们,但一次又一次地验证失败。我尝试了一些事情,比如使缓存无效、重新启动AndroidStudio和恢复密钥库的备份,但都无济于事。

    最后,在纯粹的绝望中,我试图切换密钥库密码和密钥密码。瞧,它奏效了!事实证明,几年前,当我将密码输入Gradle构建文件时,我已经切换了密码,出于某种原因,我从未注意到。

    结论:永远不要100%确定自己做得对。