2012-02-29 37 views
7

Tôi có danh sách filepath và muốn tất cả các tệp này lưu trữ dưới dạng băm mã hóa sha1 trong danh sách một lần nữa. Nó nên càng chung càng tốt, vì vậy các tập tin có thể là văn bản cũng như các tập tin nhị phân. Và bây giờ câu hỏi của tôi là:Mã hóa SHA1 trong Haskell

  1. Gói nào nên được sử dụng và tại sao?
  2. Mức độ phù hợp là cách tiếp cận như thế nào? Điều đó có nghĩa là: nếu có thể có kết quả khác với các chương trình khác nhau bằng cách sử dụng sha1 để mã hóa chính nó (ví dụ: sha1sum)
+1

Tôi không thể đánh giá chất lượng của việc triển khai, nhưng có một số triển khai SHA1 trong các gói về tấn công (phần mã hóa). Theo định nghĩa của SHA1, nó hoạt động trên các byte của tập tin, do đó, cho dù đó là văn bản hoặc nhị phân không quan trọng, và tất cả các triển khai chính xác cho kết quả tương tự cho cùng một tập tin. –

Trả lời

18

Gói cryptohash có thể là đơn giản nhất để sử dụng. Chỉ cần đọc đầu vào của bạn vào một số ByteString lười và sử dụng hàm hashlazy để nhận ByteString với băm kết quả. Đây là một chương trình mẫu nhỏ mà bạn có thể sử dụng để so sánh đầu ra với giá trị của sha1sum.

import Crypto.Hash.SHA1 (hashlazy) 
import qualified Data.ByteString as Strict 
import qualified Data.ByteString.Lazy as Lazy 
import System.Process (system) 
import Text.Printf (printf) 

hashFile :: FilePath -> IO Strict.ByteString 
hashFile = fmap hashlazy . Lazy.readFile 

toHex :: Strict.ByteString -> String 
toHex bytes = Strict.unpack bytes >>= printf "%02x" 

test :: FilePath -> IO() 
test path = do 
    hashFile path >>= putStrLn . toHex 
    system $ "sha1sum " ++ path 
    return() 

Vì đây đọc byte đơn giản, không ký tự, không nên có vấn đề mã hóa và nó sẽ luôn luôn cung cấp cho các kết quả tương tự như sha1sum:

> test "/usr/share/dict/words" 
d6e483cb67d6de3b8cfe8f4952eb55453bb99116 
d6e483cb67d6de3b8cfe8f4952eb55453bb99116 /usr/share/dict/words 

này cũng làm việc cho bất kỳ băm được hỗ trợ bởi gói cryptohash. Chỉ cần thay đổi quá trình nhập, ví dụ: Crypto.Hash.SHA256 để sử dụng hàm băm khác.

Sử dụng chế độ lười ByteStrings tránh tải toàn bộ tệp vào bộ nhớ cùng một lúc, điều quan trọng khi làm việc với tệp lớn.

Các vấn đề liên quan