SQL-based authentication: Difference between revisions
Content added Content deleted
No edit summary |
(Added Kotlin) |
||
Line 483: | Line 483: | ||
mysql_disconnect(mydb) |
mysql_disconnect(mydb) |
||
</lang> |
</lang> |
||
=={{header|Kotlin}}== |
|||
{{trans|Java}} |
|||
<lang scala>// Version 1.2.41 |
|||
import java.sql.Connection |
|||
import java.sql.DriverManager |
|||
import java.sql.ResultSet |
|||
import java.security.MessageDigest |
|||
import java.security.SecureRandom |
|||
import java.math.BigInteger |
|||
class UserManager { |
|||
private lateinit var dbConnection: Connection |
|||
private fun md5(message: String): String { |
|||
val hexString = StringBuilder() |
|||
val bytes = message.toByteArray() |
|||
val md = MessageDigest.getInstance("MD5") |
|||
val dig = md.digest(bytes) |
|||
for (i in 0 until dig.size) { |
|||
val hex = (0xff and dig[i].toInt()).toString(16) |
|||
if (hex.length == 1) hexString.append('0') |
|||
hexString.append(hex) |
|||
} |
|||
return hexString.toString() |
|||
} |
|||
fun connectDB(host: String, port: Int, db: String, user: String, pwd: String) { |
|||
Class.forName("com.mysql.jdbc.Driver") |
|||
dbConnection = DriverManager.getConnection( |
|||
"jdbc:mysql://$host:$port/$db", user, pwd |
|||
) |
|||
} |
|||
fun createUser(user: String, pwd: String): Boolean { |
|||
val random = SecureRandom() |
|||
val salt = BigInteger(130, random).toString(16) |
|||
val insert = "INSERT INTO users " + |
|||
"(username, pass_salt, pass_md5) " + |
|||
"VALUES (?, ?, ?)" |
|||
try { |
|||
val pstmt = dbConnection.prepareStatement(insert) |
|||
with (pstmt) { |
|||
setString(1, user) |
|||
setString(2, salt) |
|||
setString(3, md5(salt + pwd)) |
|||
val rowCount = executeUpdate() |
|||
close() |
|||
if (rowCount == 0) return false |
|||
} |
|||
return true |
|||
} |
|||
catch (ex: Exception) { |
|||
return false |
|||
} |
|||
} |
|||
fun authenticateUser(user: String, pwd: String): Boolean { |
|||
val select = "SELECT pass_salt, pass_md5 FROM users WHERE username = ?" |
|||
lateinit var res: ResultSet |
|||
try { |
|||
val pstmt = dbConnection.prepareStatement(select) |
|||
with (pstmt) { |
|||
setString(1, user) |
|||
res = executeQuery() |
|||
res.next() // assuming that username is unique |
|||
val passSalt = res.getString(1) |
|||
val passMD5 = res.getString(2) |
|||
close() |
|||
return passMD5 == md5(passSalt + pwd) |
|||
} |
|||
} |
|||
catch (ex: Exception) { |
|||
return false |
|||
} |
|||
finally { |
|||
if (!res.isClosed) res.close() |
|||
} |
|||
} |
|||
fun closeConnection() { |
|||
if (!dbConnection.isClosed) dbConnection.close() |
|||
} |
|||
} |
|||
fun main(args: Array<String>) { |
|||
val um = UserManager() |
|||
with (um) { |
|||
try { |
|||
connectDB("localhost", 3306, "test", "root", "admin") |
|||
if (createUser("johndoe", "test")) println("User created") |
|||
if (authenticateUser("johndoe", "test")) { |
|||
println("User authenticated") |
|||
} |
|||
} |
|||
catch(ex: Exception) { |
|||
ex.printStackTrace() |
|||
} |
|||
finally { |
|||
closeConnection() |
|||
} |
|||
} |
|||
}</lang> |
|||
=={{header|Mathematica}}== |
=={{header|Mathematica}}== |