如何使用氧化钠箱子散列字符串?

时间:2017-05-14 20:58:09

标签: hash cryptography rust

我尝试使用sodiumoxide提供的SHA256哈希函数来编写hash_string函数。此函数应接受一个字符串并返回表示为字符串的字符串的散列。

这是我到目前为止所拥有的:

extern crate sodiumoxide;

use std::string::String;
use sodiumoxide::crypto::hash::sha256;

pub fn hash_string(s: String) -> String {
    let digest = sha256::hash(&s.into_bytes());
    String::from_utf8_unchecked(digest).to_owned()
}

显然这不正确,但我不知道如何修复它。

我能够使用rust-crypto包装箱实现此功能。

pub fn hash_string(input: String) -> String {
    let mut sha = Sha256::new();
    sha.input_str(&input);
    sha.result_str()
}

我想完全按照上述方法进行,但使用的是氧化钠箱。

1 个答案:

答案 0 :(得分:2)

在您关联的文档中,Digest定义为:

pub struct Digest(pub [u8; 32]);

您可以使用元组索引表示法foo.0来访问这些字节。它还实现了AsRef<[u8]>

然后,您可以使用现有答案之一将切片转换为十六进制,例如Show u8 slice in hex representation中的切片。

extern crate sodiumoxide;

use sodiumoxide::crypto::hash::sha256;
use std::fmt;

pub fn hash_string(s: &str) -> String {
    let digest = sha256::hash(s.as_bytes());
    format!("{:X}", HexSlice::new(&digest))
}

struct HexSlice<'a>(&'a [u8]);

impl<'a> HexSlice<'a> {
    fn new<T>(data: &'a T) -> HexSlice<'a>
        where T: ?Sized + AsRef<[u8]> + 'a
    {
        HexSlice(data.as_ref())
    }
}

impl<'a> fmt::UpperHex for HexSlice<'a> {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        for byte in self.0 {
            // Decide if you want upper- or lowercase results,
            // padding the values to two characters, spaces
            // between bytes, etc.
            write!(f, "{:X}", byte)?;
        }
        Ok(())
    }
}

fn main() {
    let h = hash_string("hello world");
    println!("{}", h);
}

请注意,获取拥有的String没有任何好处,因为我们没有使用分配。