2017-05-14 47 views
0

我試圖使用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() 
} 

我想完全按照上面的說法做,但是用鈉氧化物箱代替。

+2

請包括爲什麼你認爲這是不正確的。你測試過這個功能嗎?您使用了哪些輸入(可能具有已知的預期輸出)? –

+0

它不編譯,所以我不能測試該功能。我不知道如何將[摘要](https://dnaq.github.io/sodiumoxide/sodiumoxide/crypto/hash/sha256/struct.Digest.html)轉換爲字符串。 – Wilfred

+1

假設您知道散列只是一個字節向量,將它們解釋爲UTF-8字符串是錯誤的。您可能想將其轉換爲文本表示(十六進制,Base64等)。同樣,你能提供一個輸入和預期的輸出嗎? –

回答

2

從你鏈接的文檔,Digest被定義爲:foo.0

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

可以使用元組索引符號可以訪問這些字節。它也實現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,因爲我們沒有利用分配的沒有任何好處。

+1

注意'write!(f,「{:X}」,byte)'只寫如果字節值小於16則爲一位數。當以十六進制打印散列值時,通常希望打印每個2位數的字節。這就是['hex' crate](https://crates.io/crates/hex)正在做的事情。 –

+0

@LukasKalbertodt是的!鏈接的問題/答案討論了這種細微差別(還有上/下,字節之間的填充等) – Shepmaster