add method for scrypt hash

This commit is contained in:
CounterFire2023 2023-09-14 13:13:28 +08:00
parent 8dac55ab0e
commit 5e4f502b37
5 changed files with 258 additions and 59 deletions

155
Cargo.lock generated
View File

@ -9,7 +9,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8"
dependencies = [
"crypto-common",
"generic-array",
"generic-array 0.14.6",
]
[[package]]
@ -34,7 +34,7 @@ dependencies = [
"cipher",
"ctr",
"ghash",
"subtle",
"subtle 2.4.1",
]
[[package]]
@ -123,13 +123,25 @@ dependencies = [
"digest 0.10.6",
]
[[package]]
name = "block-buffer"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
dependencies = [
"block-padding",
"byte-tools",
"byteorder",
"generic-array 0.12.4",
]
[[package]]
name = "block-buffer"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
dependencies = [
"generic-array",
"generic-array 0.14.6",
]
[[package]]
@ -138,7 +150,16 @@ version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
dependencies = [
"generic-array",
"generic-array 0.14.6",
]
[[package]]
name = "block-padding"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
dependencies = [
"byte-tools",
]
[[package]]
@ -153,6 +174,12 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87c5fdd0166095e1d463fc6cc01aa8ce547ad77a4e84d42eb6762b084e28067e"
[[package]]
name = "byte-tools"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
[[package]]
name = "byteorder"
version = "1.4.3"
@ -211,19 +238,29 @@ version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
"generic-array",
"generic-array 0.14.6",
"rand_core 0.6.4",
"typenum",
]
[[package]]
name = "crypto-mac"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5"
dependencies = [
"generic-array 0.12.4",
"subtle 1.0.0",
]
[[package]]
name = "crypto-mac"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab"
dependencies = [
"generic-array",
"subtle",
"generic-array 0.14.6",
"subtle 2.4.1",
]
[[package]]
@ -235,13 +272,22 @@ dependencies = [
"cipher",
]
[[package]]
name = "digest"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
dependencies = [
"generic-array 0.12.4",
]
[[package]]
name = "digest"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
dependencies = [
"generic-array",
"generic-array 0.14.6",
]
[[package]]
@ -252,7 +298,7 @@ checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
dependencies = [
"block-buffer 0.10.3",
"crypto-common",
"subtle",
"subtle 2.4.1",
]
[[package]]
@ -270,6 +316,12 @@ dependencies = [
"typenum",
]
[[package]]
name = "fake-simd"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
[[package]]
name = "fixed-hash"
version = "0.8.0"
@ -294,6 +346,15 @@ version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
[[package]]
name = "generic-array"
version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
dependencies = [
"typenum",
]
[[package]]
name = "generic-array"
version = "0.14.6"
@ -323,7 +384,7 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40"
dependencies = [
"opaque-debug",
"opaque-debug 0.3.0",
"polyval",
]
@ -342,13 +403,23 @@ dependencies = [
"hmac 0.12.1",
]
[[package]]
name = "hmac"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695"
dependencies = [
"crypto-mac 0.7.0",
"digest 0.8.1",
]
[[package]]
name = "hmac"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840"
dependencies = [
"crypto-mac",
"crypto-mac 0.8.0",
"digest 0.9.0",
]
@ -368,7 +439,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1"
dependencies = [
"digest 0.9.0",
"generic-array",
"generic-array 0.14.6",
"hmac 0.8.1",
]
@ -398,7 +469,7 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
dependencies = [
"generic-array",
"generic-array 0.14.6",
]
[[package]]
@ -449,7 +520,7 @@ checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451"
dependencies = [
"crunchy",
"digest 0.9.0",
"subtle",
"subtle 2.4.1",
]
[[package]]
@ -516,6 +587,12 @@ version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1"
[[package]]
name = "opaque-debug"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
[[package]]
name = "opaque-debug"
version = "0.3.0"
@ -556,7 +633,17 @@ checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166"
dependencies = [
"base64ct",
"rand_core 0.6.4",
"subtle",
"subtle 2.4.1",
]
[[package]]
name = "pbkdf2"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9"
dependencies = [
"byteorder",
"crypto-mac 0.7.0",
]
[[package]]
@ -567,7 +654,7 @@ checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6"
dependencies = [
"cfg-if",
"cpufeatures",
"opaque-debug",
"opaque-debug 0.3.0",
"universal-hash",
]
@ -708,6 +795,7 @@ dependencies = [
"primitive-types",
"qrcodegen",
"rand 0.8.5",
"scrypt",
"secp256k1",
"serde",
"serde_json",
@ -722,6 +810,19 @@ version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
[[package]]
name = "scrypt"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "656c79d0e90d0ab28ac86bf3c3d10bfbbac91450d3f190113b4e76d9fec3cfdd"
dependencies = [
"byte-tools",
"byteorder",
"hmac 0.7.1",
"pbkdf2",
"sha2 0.8.2",
]
[[package]]
name = "secp256k1"
version = "0.25.0"
@ -773,6 +874,18 @@ dependencies = [
"serde",
]
[[package]]
name = "sha2"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69"
dependencies = [
"block-buffer 0.7.3",
"digest 0.8.1",
"fake-simd",
"opaque-debug 0.2.3",
]
[[package]]
name = "sha2"
version = "0.9.9"
@ -783,7 +896,7 @@ dependencies = [
"cfg-if",
"cpufeatures",
"digest 0.9.0",
"opaque-debug",
"opaque-debug 0.3.0",
]
[[package]]
@ -814,6 +927,12 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "subtle"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee"
[[package]]
name = "subtle"
version = "2.4.1"
@ -906,7 +1025,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5"
dependencies = [
"crypto-common",
"subtle",
"subtle 2.4.1",
]
[[package]]

View File

@ -32,6 +32,7 @@ base64 = "0.21.0"
argon2 = { version = "0.5.0" }
aes-gcm = "0.10.1"
rand = "0.8.5"
scrypt = { version = "0.2", default-features = false }
[profile.release]
lto = true

View File

@ -4,7 +4,9 @@
// 测试钱包在C侧调用接口存储和重新读出钱包密钥
//
use rustwallet::{generate_sec_key, sign, sign_for_tran, wdecrypt, wencrypt, wget_address};
use rustwallet::{
generate_scrypt_hash, generate_sec_key, sign, sign_for_tran, wdecrypt, wencrypt, wget_address,
};
fn main() {
let msg = "a0f2022d15fd8072f12c76cc1596c4f1";
@ -12,40 +14,48 @@ fn main() {
let key0 = "3f26e586111b5c4cab6a5dd5e0d13c3b13184ba74410ba064a3b485be4f9a2cd";
let key1 = "";
let key2 = "cd00eb0126aeed39762579ce94c90a04695ad17fbd5e79aa4e9fc4a34ba32a5";
let private_key = generate_sec_key(
msg.to_string(),
key0.to_string(),
None,
Some(key2.to_string()),
);
println!("private_key=> {}", private_key);
// let private_key = generate_sec_key(
// msg.to_string(),
// key0.to_string(),
// None,
// Some(key2.to_string()),
// );
// println!("private_key=> {}", private_key);
let address2 = wget_address(
msg.to_string(),
key0.to_string(),
None,
Some(key2.to_string()),
);
// let address2 = wget_address(
// msg.to_string(),
// key0.to_string(),
// None,
// Some(key2.to_string()),
// );
println!("address=> {}", address2);
let message = "helloword";
let msg_encrypt = wencrypt(
msg.to_string(),
key0.to_string(),
None,
Some(key2.to_string()),
message.to_string(),
);
// println!("address=> {}", address2);
// let message = "helloword";
// let msg_encrypt = wencrypt(
// msg.to_string(),
// key0.to_string(),
// None,
// Some(key2.to_string()),
// message.to_string(),
// );
println!("msg_encrypt=> {}", msg_encrypt);
// println!("msg_encrypt=> {}", msg_encrypt);
let msg_decrypt = wdecrypt(
msg.to_string(),
key0.to_string(),
None,
Some(key2.to_string()),
msg_encrypt,
);
// let msg_decrypt = wdecrypt(
// msg.to_string(),
// key0.to_string(),
// None,
// Some(key2.to_string()),
// msg_encrypt,
// );
println!("msg_decrypt=> {}", msg_decrypt);
// println!("msg_decrypt=> {}", msg_decrypt);
let pass = "111111";
let salt = "9ded475b6bf63ee9c0150b127f6c093600e952da79ba848d6f4f9a93c3c27259";
let n: f32 = 8192f32;
let r: u32 = 8;
let p: u32 = 1;
let size: u32 = 32;
let hash = generate_scrypt_hash(pass.to_string(), salt.to_string(), n, r, p, size);
println!("scrypt hash => {}", hash);
}

View File

@ -10,7 +10,7 @@ use qr::qr_code::QR;
use secp256k1::PublicKey;
use secp256k1::SecretKey;
use std::str::FromStr;
use utils::crypto_utils::{hash_password, verify_password, zdecrypt, zencrypt};
use utils::crypto_utils::{hash_password, scrypt_hash, verify_password, zdecrypt, zencrypt};
use utils::str_utils::{base64_to_hex, hex_to_base64};
use wasm_bindgen::prelude::*;
@ -47,7 +47,13 @@ macro_rules! console_log {
}
#[wasm_bindgen]
pub fn get_public_key(id: String, openid: String, master_key: String, salt: String, pass: String) -> String {
pub fn get_public_key(
id: String,
openid: String,
master_key: String,
salt: String,
pass: String,
) -> String {
let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt);
let msg_str = format!("{}{}{}", id, openid, salt);
let msg_key = keccak256_hash(msg_str);
@ -60,7 +66,13 @@ pub fn get_public_key(id: String, openid: String, master_key: String, salt: Stri
}
#[wasm_bindgen]
pub fn generate_sec_key(id: String, openid: String, master_key: String, salt: String, pass: String) -> String {
pub fn generate_sec_key(
id: String,
openid: String,
master_key: String,
salt: String,
pass: String,
) -> String {
let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt);
let msg_str = format!("{}{}{}", id, openid, salt);
let msg_key = keccak256_hash(msg_str);
@ -73,7 +85,14 @@ pub fn generate_sec_key(id: String, openid: String, master_key: String, salt: St
}
#[wasm_bindgen]
pub fn sign(id: String, openid: String, master_key: String, salt: String, pass: String, msg: String) -> String {
pub fn sign(
id: String,
openid: String,
master_key: String,
salt: String,
pass: String,
msg: String,
) -> String {
let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt);
let msg_str = format!("{}{}{}", id, openid, salt);
let msg_key = keccak256_hash(msg_str);
@ -91,7 +110,14 @@ pub fn sign(id: String, openid: String, master_key: String, salt: String, pass:
}
#[wasm_bindgen]
pub fn sign_for_tran(id: String, openid: String, master_key: String, salt: String, pass: String, msg: String) -> String {
pub fn sign_for_tran(
id: String,
openid: String,
master_key: String,
salt: String,
pass: String,
msg: String,
) -> String {
let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt);
let msg_str = format!("{}{}{}", id, openid, salt);
let msg_key = keccak256_hash(msg_str);
@ -117,7 +143,26 @@ pub fn keccak256_hash(content: String) -> String {
}
#[wasm_bindgen]
pub fn wget_address(id: String, openid: String, master_key: String, salt: String, pass: String) -> String {
pub fn generate_scrypt_hash(
pass: String,
salt: String,
n: f32,
r: u32,
p: u32,
size: u32,
) -> String {
let nr = n.log2().ceil() as u8;
scrypt_hash(&pass, &salt, nr, r, p, size)
}
#[wasm_bindgen]
pub fn wget_address(
id: String,
openid: String,
master_key: String,
salt: String,
pass: String,
) -> String {
let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt);
let msg_str = format!("{}{}{}", id, openid, salt);
let msg_key = keccak256_hash(msg_str);
@ -133,7 +178,14 @@ pub fn wget_address(id: String, openid: String, master_key: String, salt: String
}
#[wasm_bindgen]
pub fn wencrypt(id: String, openid: String, master_key: String, salt: String, pass: String,msg: String) -> String {
pub fn wencrypt(
id: String,
openid: String,
master_key: String,
salt: String,
pass: String,
msg: String,
) -> String {
let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt);
let msg_str = format!("{}{}{}", id, openid, salt);
let msg_key = keccak256_hash(msg_str);
@ -150,7 +202,14 @@ pub fn wencrypt(id: String, openid: String, master_key: String, salt: String, pa
r
}
#[wasm_bindgen]
pub fn wdecrypt(id: String, openid: String, master_key: String, salt: String, pass: String, msg: String) -> String {
pub fn wdecrypt(
id: String,
openid: String,
master_key: String,
salt: String,
pass: String,
msg: String,
) -> String {
let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt);
let msg_str = format!("{}{}{}", id, openid, salt);
let msg_key = keccak256_hash(msg_str);

View File

@ -10,6 +10,7 @@ use argon2::{
use base64::{engine::general_purpose, Engine as _};
use ecies::{decrypt, encrypt};
use rand::prelude::*;
use scrypt::{scrypt, ScryptParams};
use secp256k1::{PublicKey, SecretKey};
use std::str;
use tiny_keccak::keccak256;
@ -29,6 +30,15 @@ pub fn hash_password(pass: &str, salt: &str) -> String {
general_purpose::STANDARD_NO_PAD.encode(&password_hash)
}
pub fn scrypt_hash(pass: &str, salt: &str, n: u8, r: u32, p: u32, size: u32) -> String {
let password = pass.as_bytes();
let salt = hex::decode(salt).expect("error decoding hex string");
let params = ScryptParams::new(n, r, p).expect("error create scrypt params");
let mut output = vec![0u8; size as usize];
scrypt(password, &salt, &params, &mut output).expect("error scrypt");
general_purpose::STANDARD_NO_PAD.encode(output)
}
pub fn verify_password(pass: &str, password_hash: &str) -> bool {
let str_tmp = match general_purpose::STANDARD_NO_PAD.decode(password_hash) {
Ok(v) => v,