LMハッシュ(LanMan、LAN Managerハッシュとも)は、もともとLAN ManagerやWindows NT以前のWindowsでパスワードを保存するために使われていたハッシュ関数であるが、後述のように、すでに破られている。過去のLAN Managerへの後方互換性を図るため、LMハッシュはのちのWindowsでも生成されていたが、マイクロソフト自身がこのハッシュ生成をオフにするよう管理者へ推奨している。そして、Windows Vistaではデフォルトでオフとなるに至ったが、サードパーティー製のCIFS実装の中には、未だにLMハッシュを使うものが存在する。

## アルゴリズム

LMハッシュの計算方法は次のようになっている。

1. パスワードは最長14文字に規制される。
2. パスワードの小文字を大文字に変換する。
3. パスワードをOEMコードページとして解釈する。
4. 14バイトに足りない分をヌル文字でパディングする。
5. 14バイトの長さになったパスワードを前後7バイトずつに分ける。
6. それぞれの片割れ(7バイト = 56ビット)をDESの鍵として使えるように、7ビットごとに区切り、区切った1つ1つの最上位に0のビットを1ビット追加して(例えば、`1010100`を`01010100`とする)64ビットの長さに変換する。なお、DESの実質の鍵長は56ビットであるが、パリティビットである8ビットを加えた64ビットの形でやりとりされる。この過程で挿入したビットは、そのパリティビットの位置に当たり、DESの計算には使われない。
7. 生成した鍵でASCII文字列の「`KGS!@#$%`」を暗号化する。DESの暗号利用モードはECBモードとし、パディングモードは`NONE`とする。
8. こうして得られた2つの暗号文字列をつなげた16バイトの値がLMハッシュとなる。

## 脆弱性

LMハッシュは、標準化されたブロック暗号であるDESを使ってはいるものの、設計段階でいくつもの脆弱性を抱えた実装であり、元のパスワードを決定可能となってしまっている。まず、パスワードが最長14文字に制限されているため、ASCIIの印字可能文字が95文字しかないことを考えれば、鍵空間は$95^{14}\approx 2^{92}$ に限られる。

そして、7文字以上のパスワードは半分に分けてそれぞれをハッシュ化するため、7文字ごとに解析することができるという脆弱性がある。パスワード7文字が取りうる組み合わせは$95^{7}\approx 2^{46}$しかなく、
14文字を一気に解析するのと比べてはるかに少なくなる。英数字のみのパスワードであれば、通常のデスクトップパソコンでも、数時間程度で総当り攻撃により元のパスワードを得ることができる。
さらに言えば、ハッシュを取る前に小文字は大文字となっているので、7文字分の鍵空間は$69^{7}\approx 2^{43}$まで減ることとなる。

また、LMハッシュにはハッシュ値の事前計算を防ぐためのソルト (暗号)が使われていない。そのため、レインボーテーブルのような、時間と空間のトレードオフを利用した攻撃が成立する。
さらに、7文字以下のパスワードを使った場合、後半7バイトはすべてヌル文字で埋められ、`0xAAD3B435B51404EE`という決まった値を生成するので、短いパスワードを簡単に判別できる。
2003年には、Ophcrackという、レインボーテーブルを使ったツールが登場し、事前に計算したデータにより、英数字のみのパスワードを数秒で破れるようになっている。
他にもRainbowCrack、L0phtCrack、Cainといった攻撃ツールがあり、LMハッシュは簡単に破れるようになってしまっている。

LMハッシュの使い方にも問題があり、パスワードの代わりにハッシュをそのまま送ることで認証を突破可能となる。

## 対策

LMハッシュの生成方法、そして認証方法に由来する脆弱性へ対応するために、マイクロソフトでは1993年のWindows NT 3.1でNTLMv1プロトコルを導入した。
NTLMのハッシュではUnicodeに対応し、`LMhash=DESeach(DOSCHARSET(UPPERCASE(password)), "KGS!@#$%")`という計算法から、`NThash=MD4(UTF-16-LE(password))`として、
さらには解析を容易にするパディングや長さ制限は廃止している。ただし、認証ステップでは56ビットの強度しかないDESが依然として使われていたほか、ソルトも施されないままであった。
さらに、NTLMの導入後もLMハッシュによる認証がデフォルトで有効となったままの期間が続き、セキュリティは向上しないままであった。パスワードの長さに管理者が最低ラインを設けられる様になるまでにも時間がかかった。

のちのWindowsではケルベロス認証を取り入れたNTLMv2が実装され、LAN Managerが時代遅れとなっても、Windows Vista・Windows Server 2008より前のWindowsではLAN ManagerやWindows Me以前、そしてNetBIOSを利用するアプリケーションの後方互換性のためにLMハッシュはデフォルトで生成されていた。そのため、特に必要がなければLM認証やNTLM認証をオフにすることが推奨されてきた。

Windows VistaやWindows Server 2008以降では、デフォルトでLMハッシュを生成しなくなったが、アカウントごとのセキュリティポリシーや、Active Directoryのグループポリシーで有効にすることもできる。同じ設定を、Windows XP以前のWindows NT系システムでLMハッシュを無効にするのに使うこともできる。この他にも、LMハッシュを生成できない15文字以上のパスワードを設定するという対策法もある。

## サードパーティー

サードパーティーによるCIFS実装では、LMハッシュを置き換える新しいプロトコルの実装に長い時間がかかっている。とりわけ、オープンソースのソフトウェアの場合、
新しいプロトコルの実装のためにリバースエンジニアリングが必要となるため、例えばNTLMv2の実装にSambaでは5年、JCIFSでは10年を費やしている。

|
|  |
NTLMプロトコルへの対応状況

| 製品 | NTLMv1への対応 | NTLMv2への対応 |
| --- | --- | --- |
| Windows NT 3.1 | Gold版(1993年) | 未サポート |
| Windows NT 3.5 | Gold版(1994年) | 未サポート |
|
| Windows NT 3.51 | Gold版(1995年) | 未サポート |
| Windows NT 4 | Gold版(1996年) | Service Pack 4 (1998年10月) |
| Windows 95 | 未サポート | ディレクトリサービスクライアント(Windows 2000 Serverと同時の2000年2月にリリース) |
| Windows 98 | Gold版 | ディレクトリサービスクライアント(Windows 2000 Serverと同時の2000年2月にリリース) |
| Windows 2000 | Gold版 | Gold版 |
| Windows Me | Gold版 | ディレクトリサービスクライアント(Windows 2000 Serverと同時の2000年2月にリリース) |
| Samba | ? | Version 3.0 (2003年9月) |
| JCIFS | 未サポート | Version 1.3.0 (2008年10月) |
| IBM AIX (SMBFS) | 5.3 (2004) | v7.1でも未対応 |