json とクエリ文字列を介して暗号化されたパスワードを渡しています。例として、パスワードが次のようなものであるとしましょう。V0VuDF9ITK+A744HD=
文字列をjsonに渡すとき、文字列をJSON.stringify
文字列化してサーバーで使用できるようにします。
var request = sb.serverRequest('changePassword', JSON.stringify({username: username, password: credentialsInput.value, original: password}));
request.done(function() {
var response = JSON.parse(request.responseText);
if(response.success) {
console.log('password changed');
} else {
setInstructions('That didn\'t work. Please try again.');
}
credentialsInput.value = ''; //Clear input
});
ただし、サーバーでパスワードを使用しようとする+
と、 がスペースに置き換えられたため、新しいパスワードは次のようになりますV0VuDF9ITK A744HD=
(真ん中のスペースに注意してください)? 渡された実際の文字列に非文字と数字が含まれるように、Javaで文字列を事前に解析するにはどうすればよいですか? 文字列をjavascriptにうまく渡すようですが、クエリ文字列を介して文字列を渡す場合もあるため、可能であればJavaで前処理することをお勧めします。
Javaでbase64エンコーダーを使用して暗号化するため、javascriptで文字列内の文字をエスケープするときに考慮しなければならない可能性があるかどうかはわかりません。=
無事通過したようです。このエンコーディング タイプが使用する、問題になる可能性のある他の文字はありますか?
PS私は実際にはjavascriptで暗号化を行っていません。それはすべてサーバーで処理されますが、この特定の例では、サーバー側で比較する必要があるため、javascriptで暗号化されたパスワードが必要です...すべてには入りません退屈な詳細。ただし、この暗号化されたパスワードもクエリ文字列を介して渡しますが、これは a+
または=
. そのような文字列をクエリ文字列でも渡すにはどうすればよいですか?
更新: パスワードの暗号化に使用するエンコード アルゴリズムは次のとおりです。base64だけだと勘違いしたのかもしれません。これはパスワードを保護する安全な方法ですか?
public static synchronized String encrypt(String plainText) throws RuntimeException {
MessageDigest md = null;
try{
md = MessageDigest.getInstance("SHA");
}catch(NoSuchAlgorithmException e){
throw new RuntimeException(e.getMessage());
}
try{
md.update(plainText.getBytes("UTF-8"));
}catch(UnsupportedEncodingException e){
throw new RuntimeException(e.getMessage());
}
byte raw[] = md.digest();
String hash = (new BASE64Encoder().encode(raw));
return hash;
}