パスワードやその他のユーザーデータを格納するLDAPサーバーがあります。
ただし、サーバーはクライアントコンピュータ認証には使用されず、クライアントアプリケーション認証にのみ使用されます。
したがって、ユーザーはクライアントからローカルにパスワードを変更できます。
LinuxハッシュをLDAPに{CRYPT} $ hashとして保存でき、cryptを使用する限りうまくいきます。
パスワードはソルトされたsha512ハッシュとして保存され、
/etc/shadowのパスワード形式は次のようになります。
printf( "$6$%s$%s", $salt, $hash )
$ saltは単にASCII文字列のようです。
$hash は $plainPW と $salt 接続の sha512 ダイジェストの Base64 エンコード結果から出たようですが、わかりません。
代わりに、LDAP はパスワードハッシュを次のように保存します。
printf( "{SSHA512}%s", $_96byteString )
$_96byteString は、$saltedPWhash と $salt を 512 ビットで連結した base64 エンコード結果です。
$hashをbase64_decodingし、$saltを追加し、結果をbase64_encodingして、上記のLDAP形式の$_96byteStringとして保存してみました。
残念ながら、LDAPはこれを認証できず、単純なldapbindが失敗します。
LDAPサーバーがこれを有効と認めるようにLinux sha512ハッシュを変換する方法を知っている人はいますか?
私はLinux cryptが標準MIMEとは異なるbase64エンコーディングを使用していることを発見しました。
Standardは[A-Za-z0-9+/]を使用し、cryptは[./0-9A-Za-z]を使用します。
だからtrに変換しようとしましたが、結果はまだ失敗しました。 :-(
答え1
私はこれが可能だとは思わない。
@Eir Nymが言ったように、パスワードがわからない場合、パスワードのMD5ハッシュをSHA-256ハッシュに変換することはできません。
しかし、あなたはします考えるSHA-256ハッシュ(crypt(3)による)をSHA-256ハッシュ(OpenLDAPによる)に変換できます。もちろん、これは単一の形式でソルトとハッシュを識別して順序を変更するだけです。相手が予想する形式です。いいえ?そうではありませんか? !
OpenLDAPでは、属性の形式はuserPassword
完全に文書化されていませんが、比較的簡単です。つまり、固定長のパスワードハッシュとソルトが続きます
contrib/slapd-modules/passwd/sha2
。OpenLDAPソース)。これはコメントでも明らかに明らかです。このOpenLDAP FAQ-o-maticの記事{SSHA}
パスワード+塩からハッシュを生成する方法を示します。
ただし、crypt(3) を使用するシステムでは、次の形式の「パスワードハッシュ」が表示されます。
$id$salt$hash
$5$
SHA-256、$6$
SHA-512などを意味します。要素は、
hash
キー、ソルト、および(一部のバリエーションでは)暗号化ラウンド数の一部の機能のBase64エンコーディング形式ですが、実際の機能は文書化されていません。
- これCryptに関するウィキペディアページ(3) 「時間が経つにつれて様々なアルゴリズムが導入された」と述べた。
- それは以下を指す「パスワードハッシュ競争」
仕様(PHC)は、「ハッシュ」文字列の完全な形式を絞り込みますが、必要なだけではありません。文字列が使用するBase64のバリエーションを完了することはありません(そのように見えますが、文字が
[.-]
何であるかを言わずにBase64文字列に表示されることを認めます)。 - これパスワードライブラリ いくつかの混乱を認めて(「上記のすべては、既存のハッシュとオペレーティングシステムの実装検証に基づく推測です」)、PHC形式をお勧めします。
- ㅏlinuxquestions.orgの質問 関連 base64 エンコーディングが特別であることを示します。
だから私たちは少し見ることができます。glibc ソースコード
地下室のため。ここでは、crypt_util.c
base64アルファベットがより一般的な(およびPHC指定)アルファベット(最後の2文字が時折変形する場合)の"./0-9A-Za-b"
代わりに使用されるという点で本当に奇妙であることを発見しました。"A-Za-z0-9+/"
役に立ちませんが、それが唯一の違いであれば処理できます。
ただしsha256-crypt.c
、たとえば、このライブラリの関数は、キーとソルトを使用して非常に奇妙で冗長な操作を実行して値を生成しますhash
。私はそれがやっていることの知恵に対する意見を危険にさらしたくありませんが、確かに簡単ではありません。
これは、crypt(3)$5$
とOpenLDAP 'SHA-256'ハッシュが、表面的に同じ暗号化基本要素を使用しますが、実際にはまったく異なる方法で使用することを意味します。それらは他のハッシュ関数と同じですしたがって、上部のポイントのようにパスワードを知らないと、1つを別のものに変換することはできません。 / SHA-512パスワードについても$6$
同様の結論を出すことができます。
これは非常に迷惑なことです。
メモ: やはり$1$
crypt(3) 形式と OpenLDAP の間で /SMD5 'ハッシュ' を変換することが可能です。
$1$salt$hash
に該当
'{SMD5}' + hash + salt
その中には+
単純な文字列連結があります。しかし、もはやMD5ハッシュを使用してはならないので、これはあまり役に立ちません。
また、次を使用して crypt(3) ハッシュを変更せずに OpenLDAP に移植することもできます。
{CRYPT}$1$salt$hash
libcが互換性がある場合(通常はOpenLDAPがLinux上で実行されている場合です。)しかし、OpenLDAPはこの方法で新しいパスワードを生成しないので、一方通行です。
答え2
簡単に言えば、答えは「いいえ」です。元のパスワードを知らず、無差別代入やその他の攻撃を使用しないと、1つのパスワードハッシュを別のパスワードハッシュに直接コーディングすることはできません。ただし、パスワードが正しい場合は、透明レイヤーを構築してハッシュを変換できます。
この質問は、次のように何度も要求されました。ここ。
私のソフトウェアで私が使用するパスワードライブラリ図書館では、私が邪魔することなくこれを行うことができます。
答え3
プレフィックスを使用して、簡単に{CRYPT}
パスワードハッシュを追加できます。/etc/shadow
ユーザーパスワードvalueは、ローカルアカウントデータを格納するシステムとLDAPサーバーにcrypt(3)機能を提供します。どちらも同じハッシュ方式を実装しています。他のシステムについては、crypt(3)のマニュアルページを確認してください。
パスワードを設定するときに、OpenLDAPのslapdに特定のハッシュパターンとソルト形式を使用してcrypt(3)ハッシュを生成させることもできます。LDAPパスワード変更拡張操作(あなたも見ることができますslapd.conf):
password-hash {CRYPT}
password-crypt-salt-format "$6$rounds=20000$%.16s"
実際、上記の例では、1つのハッシュラウンドではなく20000のハッシュラウンドが使用され、無差別代入攻撃を実行するために必要な作業量が増加するため、{SSHA512}より優れています。