3

我想同时使用它们just-argon2sodiumoxide它们分别与Argon2libsodium绑定。第一个用于密码散列,第二个用于加密等等。

但是,由于 libsodium 本身也包含 Argon2 代码,因此在构建时出现以下链接器错误:

error: linking with `link.exe` failed: exit code: 1169
  |
  = note: "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Preview\\VC\\Tools\\MSVC\\14.29.30132\\bin\\HostX64\\x64\\link.exe" "/NOLOGO" "/NXCOMPAT" "/LIBPATH:<omitted>\\rust-ms\\tools\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.0.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.1.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.10.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.11.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.12.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.13.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.14.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.15.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.2.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.3.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.4.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.5.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.6.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.7.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.8.rcgu.o" "<omitted>\\target\\debug\\deps\\sw_password_vault.sw_password_vault.cvsxie8m-cgu.9.rcgu.o" "/OUT:<omitted>\\target\\debug\\deps\\sw_password_vault.exe" "<omitted>\\target\\debug\\deps\\sw_password_vault.2501tt6qpnxmq6dq.rcgu.o" "/OPT:REF,NOICF" "/DEBUG" "/NATVIS:<omitted>\\rust-ms\\tools\\lib\\rustlib\\etc\\intrinsic.natvis" "/NATVIS:<omitted>\\rust-ms\\tools\\lib\\rustlib\\etc\\liballoc.natvis" "/NATVIS:<omitted>\\rust-ms\\tools\\lib\\rustlib\\etc\\libcore.natvis" "/NATVIS:<omitted>\\rust-ms\\tools\\lib\\rustlib\\etc\\libstd.natvis" "/LIBPATH:<omitted>\\target\\debug\\deps" "/LIBPATH:<omitted>\\target\\debug\\build\\just-argon2-fba8d38863f06c3e\\out" "/LIBPATH:C:\\Users\\Steven\\.cargo\\registry\\src\\github.com-1ecc6299db9ec823\\libsodium-sys-0.2.7\\msvc/x64/Debug/v142/" "/LIBPATH:<omitted>\\rust-ms\\tools\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib" "<omitted>\\target\\debug\\deps\\libargon2-47416e342f12fc80.rlib" "<omitted>\\target\\debug\\deps\\libbitflags-033856bffcb41e1a.rlib" "<omitted>\\target\\debug\\deps\\libsodiumoxide-ae3f70995957a7e5.rlib" "<omitted>\\target\\debug\\deps\\libserde-02c238cdfdb411bb.rlib" "<omitted>\\target\\debug\\deps\\libed25519-a72dcd735d2405a2.rlib" "<omitted>\\target\\debug\\deps\\libsignature-cb8ca284112f3bdb.rlib" "<omitted>\\target\\debug\\deps\\liblibsodium_sys-90db65a5d41df800.rlib" "<omitted>\\target\\debug\\deps\\liblibc-db8e81727092f722.rlib" "<omitted>\\rust-ms\\tools\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\libstd-7d8f1d3120dc2b31.rlib" "<omitted>\\lib\\libpanic_unwind-00b4871c13b6f72d.rlib" "<omitted>\\lib\\libstd_detect-38300272c9518b1b.rlib" "<omitted>\\lib\\librustc_demangle-008ea074760d3d54.rlib" "<omitted>\\lib\\libhashbrown-5d102da67e495133.rlib" "<omitted>\\lib\\librustc_std_workspace_alloc-108ed3dcf248b873.rlib" "<omitted>\\lib\\libunwind-bc9246c93f49e49a.rlib" "<omitted>\\lib\\libcfg_if-7ca234fdcd728c26.rlib" "<omitted>\\lib\\liblibc-e328514fb4ed0383.rlib" "<omitted>\\lib\\liballoc-5d0a4c6a1ffa6373.rlib" "<omitted>\\lib\\librustc_std_workspace_core-d379e9227cab087f.rlib" "<omitted>\\lib\\libcore-825774e96423c2c5.rlib" "<omitted>\\lib\\libcompiler_builtins-d5d1908505fa83bc.rlib" "advapi32.lib" "ws2_32.lib" "userenv.lib" "msvcrt.lib"
  = note: liblibsodium_sys-90db65a5d41df800.rlib(blake2b-ref.obj) : error LNK2005: blake2b_init already defined in libargon2-47416e342f12fc80.rlib(blake2b.o)
          liblibsodium_sys-90db65a5d41df800.rlib(blake2b-ref.obj) : error LNK2005: blake2b_init_key already defined in libargon2-47416e342f12fc80.rlib(blake2b.o)
          liblibsodium_sys-90db65a5d41df800.rlib(blake2b-ref.obj) : error LNK2005: blake2b_init_param already defined in libargon2-47416e342f12fc80.rlib(blake2b.o)
          liblibsodium_sys-90db65a5d41df800.rlib(blake2b-ref.obj) : error LNK2005: blake2b_update already defined in libargon2-47416e342f12fc80.rlib(blake2b.o)
          liblibsodium_sys-90db65a5d41df800.rlib(blake2b-ref.obj) : error LNK2005: blake2b_final already defined in libargon2-47416e342f12fc80.rlib(blake2b.o)
          liblibsodium_sys-90db65a5d41df800.rlib(blake2b-ref.obj) : error LNK2005: blake2b already defined in libargon2-47416e342f12fc80.rlib(blake2b.o)
             Creating library C:\dev\Rust\SWPasswordVault\target\debug\deps\sw_password_vault.lib and object C:\dev\Rust\SWPasswordVault\target\debug\deps\sw_password_vault.exp
          LINK : warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library
          C:\dev\Rust\SWPasswordVault\target\debug\deps\sw_password_vault.exe : fatal error LNK1169: one or more multiply defined symbols found

两个库都导出了blake2b_*Argon2 实现使用的相同符号,因此名称冲突。

现在您可能想知道:为什么不直接使用 libsodium pwhashAPI,它在内部使用 Argon2(因此出现链接器错误)?因为我想使用 libsodium 未公开的并行 Argon2,因为它将并行度硬编码为 1

显然,这些blake2b_*符号 标记ARGON2_LOCAL,所以它们不是 export,但我想这并不重要,因为它们仍然存在于链接器中。

一种解决方案可能是使用 Argon2 的纯 Rust 实现,例如rust-argon2,但我测试了一个,不幸的是它慢了很多。

我怎样才能同时使用这两个库?我是否必须仅使用just-argon2并导出板条箱提供的功能just-argon2或类似的东西来制作一个单独的库板条箱,或者那不起作用/有更好的方法吗?编辑:这不起作用。

最小非编译程序:

use sodiumoxide;
use argon2;

fn main() { sodiumoxide::init(); }

在编写这个程序时,我注意到当我交换use语句时它编译得很好,但它在运行时崩溃:

use argon2;
use sodiumoxide;

fn main() {
    sodiumoxide::init().expect("Could not init libsodium");

    let password = "pass";

    let salt = sodiumoxide::crypto::pwhash::gen_salt().0;
    let mut key_bytes = [0u8; 32];

    // INSECURE cost parameters
    argon2::id_hash_raw(1, 1 << 10 /*1 MiB*/, 1,
                        Some(password.as_bytes()), Some(&salt), &mut key_bytes)
        .unwrap_or_else(|err| panic!("Error hashing: {:?}", err));
}

这会因STATUS_STACK_BUFFER_OVERRUNWindows 异常__fastfail(FAST_FAIL_STACK_COOKIE_CHECK_FAILURE)(显然不同的出口冲突还是什么?

顺便说一句:我对 Rust 很陌生,所以可以肯定地说我不知道​​它的所有来龙去脉。

4

0 回答 0