【问题标题】:SCrypt produces different result on x64 platformSCrypt 在 x64 平台上产生不同的结果
【发布时间】:2023-04-02 07:23:01
【问题描述】:

我在我的 android 应用程序中使用这个库 https://github.com/wg/scrypt。 我可以成功编译它并在我的 android 应用程序中绑定本机实现,但是如果 scryptN 函数在 32 位或 64 位环境中执行,它会产生不同的结果,这怎么可能? 相反,java 实现在两种环境下都运行良好

要重现问题,只需使用 NDK 构建共享库并尝试运行此功能

public String hashPassword(String plainPassword) {
        final int shift = 14;
        final int n = 1 << shift;
        final int r = 8;
        final int p = 1;
        final int dklen = 64;

        try {
            return ByteUtils.toHexString(SCrypt.scrypt(
                plainPassword.getBytes("utf-8"),
                "theseed".getBytes("utf-8"),
                n, r, p, dklen));
        } catch (Exception e) {
            LogHelper.e("error hashing password", e);
            return null;
        }
    }

如果您在 32 位架构或 64 位架构上运行,您将获得不同的输出

谢谢

【问题讨论】:

  • 示例代码和示例输入/输出?
  • 虽然将所有调用混为一谈可能非常“利特”,但实际上无法调试。将调用 plainPassword.getBytestheseed".getBytes 分解为中间变量,然后以十六进制检查它们。调试的第一步是验证输入。为下一个阅读器和调试器制作代码,让编译器处理优化,中间变量一般在编译器优化时组合在一起。

标签: scrypt


【解决方案1】:

终于找到了解决办法:

对于在 Android 上使用这个库的任何人,我建议改用这个 fork

https://github.com/lhunath/scrypt

它有一个完整的 android ndk 项目设置,您只需从 src/android/jni 文件夹运行 ndk-build(当然您需要正确配置 NDK),它会生成一组工作的 .so 文件.

注意:您必须更改 Application.mk 文件才能为所有平台生成它们

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多