ECMA-376仕様のパート1 (18.3.1.85 sheetProtectionを参照)では、シート保護用のパスワードハッシュを生成するための次の3つの属性について詳しく説明しています。
AlgorithmName
(デフォルトはSHA-1)
saltValue
上記の属性値で定義されたハッシュアルゴリズムを使用してハッシュされる前にユーザー提供のパスワードに付加されてhashValue属性を生成し、ハッシュの生成を試みる前にユーザー提供のパスワードにも付加されるソルトを指定します比較のための値。
spinCount
比較を試みるときに、ハッシュ関数を繰り返し実行する回数を指定します(各反復の結果に、次の反復の入力として反復数を含む4バイト値(0ベース、リトルエンディアン)を加えて実行します)。 hashValue属性に格納されている値を持つユーザー指定のパスワード。
私はこのようなものが機能することを期待していました:
def hash_password(v)
require 'digest/sha1'
spin_count = 10
salt_value = Digest::SHA1.hexdigest(rand(36**8).to_s(36))
salty = salt_value + v
hash_value = nil
spin_count.times do |count|
hash_value = Digest::SHA1.hexdigest((hash_value ||= salty ) + Array(count).pack('V'))
end
hash_value
終わり
ここで私が間違っていることを誰かが指摘できれば本当にありがたいです。
編集:もう少しコンテキストを与えるために:
この擬似コードは、xlsxスプレッドシートを作成するためにaxlsxgemから抽出されます。ここで155行目あたりから実際のコードを見ることができます
OpenOfficeのDanielRentzが提供するアルゴリズムに基づいて、はるかに古いバージョンのパスワードハッシュを実装することができましたhttp://www.openoffice.org/sc/excelfileformat.pdf、リビジョン1.42、115ページ(21.05.2012)ただし、これは仕様に記載されているものとは大きく異なります。
リポジトリをフォークする場合は、examples / sheet_protection.rbを実行して、2枚のシートでワークブックを作成できます。1枚はECMA仕様を使用し、もう1枚はOpenOfficeのバージョンを使用します。「ツール」->「保護」->「保護を無効にする」(ここでは日本語から翻訳します。実際のメニューテキストは異なる場合があります)をクリックしてパスワードを入力すると、ECMAバージョンでは失敗します。
更新:2012.05.23
もう少し詳しく見てみると、仕様の4番目の部分(15.3.1.5、15.3.1.6)は、「移行適合クラス」の古いスタイルのシート保護生成に準拠するオプションのパスワード属性があることを示しています。
password(Password)このチャートシートの編集に必要なパスワードのハッシュを指定します。ハッシュは、workbookProtection要素のrevisionPassword属性で定義されたロジックを使用して生成されます(パート1、§18.2.29)
これは少なくとも、OpenOfficeアルゴリズムがまだ機能する理由を説明しています。