私がやろうとしているのは、SHA1 UTF-8暗号化を使用し、次にbase64エンコーディングとパスワード文字列値を使用することです。ただし、最初に暗号化を行い、次にエンコードを行う必要がありましたが、逆の方法で行いました。
コードは次のとおりです。
# Create Input Data
$enc = [system.Text.Encoding]::UTF8
$string1 = "This is a string to hash"
$data1 = $enc.GetBytes($string1)
# Create a New SHA1 Crypto Provider
$sha = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider
$# Now hash and display results
$result1 = $sha.ComputeHash($data1)
そのため、ハッシュを実行したときに、文字列からbyte []が必要であることがわかりましたが、その方法がわかりません。 .Netライブラリから簡単な方法があると考えていますが、例を見つけることができませんでした。
したがって、次のような文字列がある場合:
$string = "password"
:: ComputeHash($ string)で使用できるバイト配列に変換するにはどうすればよいですか?
結局、暗号化されたSHA-1とbase 64でエンコードされたUTF-8パスワードが必要になります。これは上記のコードと同じですが、最初に暗号化したJavaで同じものをコーディングしたときとは異なります。次に、その結果をBase 64エンコードに変換しました。
文字列を直接暗号化することはAPIではサポートされていませんが、これを可能にする回避策があるかもしれないと仮定しています。それが私がやろうとしていることです。
したがって、コードの問題は、最初に暗号化してからエンコードしてから正しい値を取得する必要があるということです。正しいですか、ここで何か不足していますか?
適切なJava動作するコード:
//First method call uses a swing component to get the user entered password.
String password = getPassword();
//This line is where the work starts with the second and third methods below.
String hashed = byteToBase64(getHash(password));
//The second method call here gets the encryption.
public static byte[] getHash(String password) {
MessageDigest digest = null;
byte[] input = null;
try {
digest = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
digest.reset();
try {
input = digest.digest(password.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return input;
}
//Then the third method call here gets the encoding, FROM THE ENCRYPTED STRING.
public static String byteToBase64(byte[] data){
return new String(Base64.encodeBase64(data));
「=」のパスワード文字列でJavaコードを実行すると、
[91、-86、97、-28、-55、-71、63、63、6、-126、37、11、108、-8、51、27、126、-26、-113、-40]これは暗号化です。
次に、Javaでエンコードすると、これを取得します:W6ph5Mm5Pz8GgiULbPgzG37mj9g =
しかし、PowerShellで実行すると、UTF8用に最初にエンコードされているため、これが得られます:
91170 97228201185 63 63 6130 37 11108 248 51 27126230143216
次に、このコード行を実行して変換すると、エラーが発生します。
$base64 = [System.Convert]::FromBase64String($result)
「1」引数で「FromBase64String」を呼び出す例外:「Base-64文字配列の長さが無効です。」 1行目:char:45
ただし、新しいコード行を実行して下から16進数にすると、次のようになります。
$hexResult = [String]::Join("", ($result | % { "{0:X2}" -f $_}))
PS C:\Program Files (x86)\PowerGUI> Write-Host $hexResult
5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8
しかし、私はこの値で終わる必要があります:
W6ph5Mm5Pz8GgiULbPgzG37mj9g =
繰り返しますが、これを行うことさえできないかもしれませんが、私は見るための回避策を見つけようとしています。
ほとんどの場合、最後の行の後にハッシュをbase64に変換する必要があります。
$enc = [system.Text.Encoding]::UTF8
$string1 = "This is a string to hash"
$data1 = $enc.GetBytes($string1)
# Create a New SHA1 Crypto Provider
$sha = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider
# Now hash and display results
$result1 = $sha.ComputeHash($data1)
[System.Convert]::ToBase64String($result1)
テキスト->バイト->暗号化/ハッシュ-> Base64
これは、暗号化されたデータをテキスト形式で送信するためのvery共通パターンです。
順調に進んでいるようです。文字列とバイト配列を変換するには、文字エンコーディングを選択する必要があります。上記でUTF-8を選択しましたが、他のオプション(ASCII、UTF-16など)があります。
文字列を直接暗号化することはサポートされていません。
問題は、最初のバイト配列では符号付きバイト(-86 = 10101010)であり、2番目では符号なしバイト(170 = 10101010)であるようです。