SQL Server 2008には、既存のPHP Webアプリケーションのストアドプロシージャを使用してユーザー認証を実行する既存のデータベースがあります。 Webアプリケーションはストアドプロシージャに文字列を送信しますが、ストアドプロシージャはSQLチェックサム(http://msdn.microsoft.com/en-us/library/ms189788.aspx)で値をチェックし、ストアします。ストアドプロシージャは、文字列をNVARCHAR(50)としてキャストし、CHECKSUMをintとしてuserテーブルに格納します。JavaでSQL CHECKSUMを実装する
私は今、既存のデータベースの上に新しいJavaアプリケーションを書いています、と私は、カスタムスプリング認証マネージャを書いています。 JavaでCHECKSUMアルゴリズムを再実装したいので、変換を実行するためにストアドプロシージャを呼び出す必要はありませんが、SQL CHECKSUMの動作に関するドキュメントは見つかりません。
しかし私はそれがSQL CHECKSUMと同じ値を返すことに失敗し、それがCRC32だったことを推測して、次のコードを試してみました:
String pass = "foobar";
CRC32 crc32 = new CRC32();
crc32.update(pass.getBytes("UTF-16")); //This is due to the stored procedure casting as nvarchar
crc32.getValue();
誰もがSQLチェックサムが私を使用するアルゴリズムに私を指すことができますそれをJavaで再実装できますか?
問題は、どのアルゴリズムがセキュリティのために最良のハッシュを提供するかではありません。セキュリティは、システム全体のパスワードを強制的にリセットする準備ができていないため、この特定のインスタンスの要件の範囲外です。問題は、T-SQL CHECKSUMがどのアルゴリズムを使用しているかであり、その結果、再実装できるということです。この特定のユースケースはauthですが、多くの異なるアプリケーションではこれが必要である可能性があります。
は、あなただけのいくつかの既存のJava機能を使用して、新しいハッシュですべてのデータを更新することができませんか?おそらく、現在のものを保持するための新しい列として(おそらく)。これはあまりにも役立つかもしれませんhttp://stackoverflow.com/q/331157/27535 – gbn
それは最終的なオプションになる必要が終了する可能性があります。ただし、元のパスワードはデータベースに保存されていないため、既存のアカウントのパスワードをリセットする必要があります。 – aweigold
@aweigold:正しい方法でパスワードを扱うための+1: –