代码之家  ›  专栏  ›  技术社区  ›  Mark Bolusmjak

简单(编码)安全哈希函数

  •  7
  • Mark Bolusmjak  · 技术社区  · 15 年前

    我需要具有以下属性的安全(加密)哈希函数:

    1. 可以用尽可能少的行进行编码(在R5RS方案中)。希望50岁以下。
    2. 内存和CPU性能不符合密码长度数据的原因。(例如,它不必非常高效,也不必为数百万字节的数据创建哈希)

    我能找到的大多数安全散列函数都是在考虑速度/内存效率的情况下设计的,因此对代码来说很复杂。

    当前的候选对象是mash-1(或mash-2): Handbook of applied cryptography. Google Books

    谢谢。

    编辑: 感谢大家的回答。请原谅我,如果下面的话太无礼了,我只想说清楚。请相信我已经完成了我的家庭作业并考虑了“标准”选项。我知道最简单的方法就是使用其中之一,但这不是我要找的。

    我想回答的一个问题是: 什么样的加密安全哈希算法可以在最小数量的“可读”代码中实现?

    我已经发布了我能找到的最好的候选人。任何简单的建议,或者关于mash-1/2的评论都是最有用的。

    5 回复  |  直到 15 年前
        1
  •  2
  •   Accipitridae    15 年前

    如果你更喜欢简单和教学价值而不是效率,那么 VSH 哈希函数可能是一个选项。虽然这个函数缺少其他哈希函数所具有的一些其他属性(例如伪随机性),但它带有很强的参数,即vsh是一个抗冲突哈希函数。

        2
  •  4
  •   Tom Ritter    15 年前

    如果您想要一个安全散列函数来实际保护某些内容(例如,作为加密算法的一部分),最好使用sha-512的库实现(或者可能是ripemd-160或其他一些实现)。

    如果你想要它来散列密码,我想说像mash这样的散列函数可以满足抵抗蛮力(与salt一起使用)和彩虹表的需求。我仍然不会使用它,除非我有严格的要求禁止或阻止我使用库实现-但听起来你可能只有这些。

    如果你想让它更不安全,比如说文件完整性检查,几乎任何事情都可以做到,除非你明确地担心恶意用户会产生冲突。在这种情况下,根据您所保护的内容的价值,我将从简单的mash到更具抵抗力的sha-512或ripemd-320。

        3
  •  2
  •   Rasmus Faber    15 年前

    对于您的要求,我会查看 SHA-3 finalists .

    如果您已经为加密实现了aes原语,那么您可以重新使用它来相对简单地实现几个函数。

    否则,我想我会和丹尼尔·伯恩斯坦一起去 Cubehash . 那一个看起来有一些“简单的优雅”,你正在寻找。

        4
  •  2
  •   Mark Bolusmjak    15 年前

    根据Bruce Schneier的“应用密码学”第18.12节: “可以使用块链接模式下的公钥加密算法作为单向哈希函数。”

    RSA(私钥被丢弃)被列为示例。安全性和RSA一样强。

    RSA加密步骤很容易实现。尤其是在具有任意大小整数的语言中。

    2个注意事项是: 1。比大多数(所有)其他安全哈希函数慢得多。这对我来说很好。 2。如果您硬编码您的公钥到代码中,世界将不得不相信您丢弃了您的私钥数据。或者创建自己的公钥。

    只要有一个有效的例子,我就会发布代码。

    编辑:给你。30行。简单。安全。 编辑2:我实际包含的是一个变体,可能不起作用。请参阅本文下面的评论并查看更新。

    ; compute a^d mod n
    (define powmod
      (lambda (a d n)
        (cond 
          ((= 0 d) 1)
          ((= 1 d) (modulo a n))
          ((= 0 (modulo d 2)) (modulo (expt (powmod a (/ d 2) n) 2) n))
          (else
            (modulo (* (powmod a 1 n) (powmod a (- d 1) n)) n)))))
    
    (define foldr
      (lambda (func end lst)
        (if (null? lst)
          end
          (func (car lst) (foldr func end (cdr lst))))))
    
    ; something to turn a string into a number
    (define any-string->number
      (lambda (s)
        (foldr
          (lambda (a b) (+ a (* 256 b)))
          0
          (map char->integer (string->list s)))))
    
    ; some big primes
    (define p 325981479175658910158495167696993467513669112200235950741366213684181287869366665231)
    (define q 930416184994449450269535709442344346507738432154879695027334802205487824589832585453)
    
    ; hash turns a string into a number
    ; see discrete logarithms. the inverse of this is *hard* to compute
    ; http://en.wikipedia.org/wiki/Discrete_logarithm
    (define hash
      (lambda (s)
        (powmod (any-string->number s) p q)))
    
        5
  •  1
  •   JP Alioto    15 年前

    退房 TrueCrypt source . 它们实现了几个强大的哈希函数。只是标准警告,修改现有的实现是不明智的,或者更糟的是,使用自己的实现。几乎可以肯定的是,它会带来弱点。我知道你不是在这里做的,只是免责声明。:)